Digamos que tengo el siguiente conjunto de datos:
import numpy as np import pandas as pd d = {'column1': ['a', 'b', 'c'], 'a': [10, 8, 6], 'a1': [1, 2, 3], 'b': [4, 2, 6], 'b1': [1, 4, 8], 'c': [2, 6, 8], 'c1': [2, 1, 8] } data_frame = pd.DataFrame(data=d).set_index('column1')Lo que quiero lograr es seguir. Sume los valores de cada fila, excluyendo las observaciones donde a=a, a=a1, b=b, b=b1, etc.
Así que en el conjunto de datos final quiero tener algo como esto:
f={'total': [9, 17, 23]} final_frame = pd.DataFrame(data=f)Donde 9 = b + b1 + c + c1 y así sucesivamente.
Obviamente, puedo lograr esto con el comando iloc[] en cada fila. Pero mi marco de datos real es bastante grande y, como puede ver, la posición de los elementos ij que deben eliminarse no es constante en las filas (por lo que cada iloc en cada fila será una secuencia diferente, pero consistente).
¿Alguna sugerencia?
Mejor,
Solución con DataFrame.melt , comapre índices por nombres de columnas sin números y para sum agregadas no iguales:
df = data_frame.melt(ignore_index=False) df = (df.loc[df['variable'].str.extract('(\D+)', expand=False).ne(df.index), 'value'] .groupby(level=0) .sum() .reset_index(name='total')) print (df) column1 total 0 a 9 1 b 17 2 c 23Otra idea:
df = data_frame.copy() df.columns = df.columns.str.extract('(\D+)', expand=False) s = df.groupby(level=0, axis=1).sum().stack() df = s[[a != b for a, b in s.index]].groupby(level=0).sum().reset_index(name='total') print (df) column1 total 0 a 9 1 b 17 2 c 23Una opción más rápida, en mi opinión, sería evitar aumentar el número de filas (las pruebas son la única forma de confirmar esto):
data_frame.columns =data_frame.columns.str.split(r'(\d+)', expand = True).droplevel(-1) temp = data_frame.set_index([np.arange(len(data_frame))], append=True).unstack(level=0) filters = [col for col in temp if col[0] != col[-1]] out = temp.loc[:, filters].sum(1) out.to_frame(name='total') total 0 9.0 1 17.0 2 23.0