4 回答

TA貢獻1818條經驗 獲得超11個贊
您可以通過使用filter獲取列 Gr,使用where通過split(獲取 GrV,GrX,...部分)獲得的列名的第一個元素等于列 X 并sum沿列:
df['Total'] = (df.filter(like='Gr')
.where(lambda x: df['X'].to_numpy()[:, None]
== x.columns.str.split(' ').str[0].to_numpy())
.sum(axis=1)
)
print (df)
X GrV A GrX A GrY A GrZ A GrV B GrX B GrY B GrZ B Total
0 GrV 4 3 5 1 4 3 5 1 8.0
1 GrX 2 4 2 2 2 4 2 2 8.0
2 GrY 6 5 2 5 6 5 2 5 4.0
3 GrZ 5 1 6 5 5 1 6 5 10.0
4 GrV 1 2 5 2 1 2 5 2 2.0
5 GrX 2 5 1 1 2 5 1 1 10.0
6 GrY 5 6 5 5 5 6 5 5 10.0
7 GrZ 6 2 4 4 6 2 4 4 8.0

TA貢獻1804條經驗 獲得超7個贊
這是另一種方法:
for col in df['X'].tolist():
df['Total_'+col] = np.where(df['X']==col, df[col+' A'] + df[col+' B'], np.NaN)
cols = [col for col in df.columns if col.startswith('Total_')]
df['Total'] = df[cols].sum(axis=1)
df.drop(columns=cols, inplace=True)
print(df)
X GrV A GrX A GrY A GrZ A GrV B GrX B GrY B GrZ B Total
0 GrV 4 3 5 1 4 3 5 1 8.0
1 GrX 2 4 2 2 2 4 2 2 8.0
2 GrY 6 5 2 5 6 5 2 5 4.0
3 GrZ 5 1 6 5 5 1 6 5 10.0
4 GrV 1 2 5 2 1 2 5 2 2.0
5 GrX 2 5 1 1 2 5 1 1 10.0
6 GrY 5 6 5 5 5 6 5 5 10.0
7 GrZ 6 2 4 4 6 2 4 4 8.0

TA貢獻1998條經驗 獲得超6個贊
這是一種方法:將列 X 附加到索引,獲得一對索引和列,其中可以在列中找到新索引中的值,使用結果值索引數據幀(使用loc),堆棧,取消堆棧和得到總數
#append column X to the index
df = df.set_index("X",append=True)
from itertools import product
#get pairing of index and column, where index is in column
index = [(first,second, last)
for (first,second), last
in product(df.index,df.columns)
if second in last]
#stack, index with the index variable,
#unstack, get the sum
#and assign to Total
df['Total'] = df.stack().loc[index].unstack().sum(axis=1)
df
GrV A GrX A GrY A GrZ A GrV B GrX B GrY B GrZ B Total
X
0 GrV 4 3 5 1 4 3 5 1 8.0
1 GrX 2 4 2 2 2 4 2 2 8.0
2 GrY 6 5 2 5 6 5 2 5 4.0
3 GrZ 5 1 6 5 5 1 6 5 10.0
4 GrV 1 2 5 2 1 2 5 2 2.0
5 GrX 2 5 1 1 2 5 1 1 10.0
6 GrY 5 6 5 5 5 6 5 5 10.0
7 GrZ 6 2 4 4 6 2 4 4 8.0

TA貢獻1875條經驗 獲得超5個贊
讓我們melt試試groupby
s=df.reset_index().melt(['index','X']).loc[lambda x : x['X']==x['variable'].str.split(' ').str[0]].groupby('index').value.sum()
df['new']=s
df
X GrV A GrX A GrY A GrZ A GrV B GrX B GrY B GrZ B new
0 GrV 4 3 5 1 4 3 5 1 8
1 GrX 2 4 2 2 2 4 2 2 8
2 GrY 6 5 2 5 6 5 2 5 4
3 GrZ 5 1 6 5 5 1 6 5 10
4 GrV 1 2 5 2 1 2 5 2 2
5 GrX 2 5 1 1 2 5 1 1 10
6 GrY 5 6 5 5 5 6 5 5 10
7 GrZ 6 2 4 4 6 2 4 4 8
添加回答
舉報