Python:计算dataframe中列的减法

Python:计算dataframe中列的减法,python,pandas,dataframe,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

我有这样一个数据帧:

   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
我想做一个减法运算,得到如下结果:

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

试试这个:

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
一种方法是根据列的结尾是
\u A
还是
\u B
来计算列,然后对过滤后的数据帧进行计算。将所有其他列放入索引中,然后在末尾重置索引以将其取回:

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