我有一个像这样的数据框:
id_A id_B f1_A f2_A f3_A f1_B f2_B f3_B t
1 2 1 2 3 4 5 6 1
2 3 4 5 6 7 8 9 0
3 4 7 8 9 8 7 6 1
我想进行减法运算以产生如下结果:
id_A id_B f1_A-f1_B f2_A-f2_B f3_A-f3_B t
1 2 -3 -3 -3 1
2 3 -3 -3 -3 0
3 4 -1 1 3 1
将(df中的第3到第5列)减去(df中的第6到第8列),而将列的索引更改为fx_A-fy_A。
我尝试使用
df[cols[2:5]].sub(df[cols[5:8]], fill_value=0)
但是,结果绝对不是我想要的:
f1_A f1_B f2_A f2_B f3_A f3_B
1.0 -4.0 2.0 -5.0 3.0 -6.0
4.0 -7.0 5.0 -8.0 6.0 -9.0
7.0 -8.0 8.0 -7.0 9.0 -6.0
我现在不知道如何获得理想的结果。对不起我的英语,我仍然是Python的初学者,任何帮助将不胜感激!
答案 0 :(得分:2)
尝试一下:
df['f1_A-f1_B'] = df['f1_A'] - df['f1_B']
df['f2_A-f2_B'] = df['f2_A'] - df['f2_B']
df['f3_A-f3_B'] = df['f3_A'] - df['f3_B']
print(df[['id_A', 'id_B', 'f1_A-f1_B', 'f2_A-f2_B', 'f3_A-f3_B', 't']])
# id_A id_B f1_A-f1_B f2_A-f2_B f3_A-f3_B t
# 0 1 2 -3 -3 -3 1
# 1 2 3 -3 -3 -3 0
# 2 3 4 -1 1 3 1
答案 1 :(得分:2)
一种方法是根据列以_A
或_B
结尾来对filter列进行处理,然后对这些过滤后的数据帧进行计算。将所有其他列放在索引中,然后在最后重置索引以将其取回:
df.set_index(['id_A','id_B','t'],inplace=True)
A = df.filter(regex='f*_A')
B = df.filter(regex='f*_B')
new_df = (A.values - B)
# Join your column names
new_df.columns = ['-'.join((x,y)) for x,y in zip(A.columns,B.columns)]
new_df.reset_index(inplace=True)
>>> new_df
id_A id_B t f1_A-f1_B f2_A-f2_B f3_A-f3_B
0 1 2 1 -3 -3 -3
1 2 3 0 -3 -3 -3
2 3 4 1 -1 1 3