Python:计算数据框中的列相减

时间:2018-10-26 21:58:07

标签: python pandas dataframe

我有一个像这样的数据框:

   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的初学者,任何帮助将不胜感激!

2 个答案:

答案 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