pandas 中的许多列与基线列不同

Difference many columns from a baseline column in pandas

我在 pandas 数据框中有一个基线列 (base),我想将所有其他列 x* 与该列区分开来,同时保留两组 group1, group2:

最简单的方法是通过做简单的差异:

df = pd.DataFrame({'group1': [0, 0, 1, 1], 'group2': [2, 2, 3, 4],
                   'base': [0, 1, 2, 3], 'x1': [3, 4, 5, 6], 'x2': [5, 6, 7, 8]})

df['diff_x1'] = df['x1'] - df['base']
df['diff_x2'] = df['x2'] - df['base']

   group1  group2  base  x1  x2  diff_x1  diff_x2
0       0       2     0   3   5        3        5
1       0       2     1   4   6        3        5
2       1       3     2   5   7        3        5
3       1       4     3   6   8        3        5

但是我有数百个列需要执行此操作,因此我正在寻找一种更有效的方法。

您可以使用 sub 方法和 axis=0 从数据帧列中减去一个系列,这样可以避免单独为每一列进行减法:

to_sub = df.filter(regex='x.*')  # filter based on your actual logic
pd.concat([
  df, 
  to_sub.sub(df.base, axis=0).add_prefix('diff_')
], axis=1)
#   group1  group2  base  x1  x2  diff_x1  diff_x2
#0       0       2     0   3   5        3        5
#1       0       2     1   4   6        3        5
#2       1       3     2   5   7        3        5

另一种方法是使用 df.drop(..., axis=1)。然后将该数据帧的每个剩余列传递到 sub(..., axis=0)。保证您捕获所有列并保留它们的顺序,甚至不需要正则表达式。

df_diff = df.drop(['group1','group2','base'], axis=1).sub(df['base'], axis=0).add_prefix('diff_')

   diff_x1  diff_x2
0        3        5
1        3        5
2        3        5
3        3        5 

因此您的完整解决方案是:

pd.concat([df, df_diff], axis=1)

   group1  group2  base  x1  x2  diff_x1  diff_x2
0       0       2     0   3   5        3        5
1       0       2     1   4   6        3        5
2       1       3     2   5   7        3        5
3       1       4     3   6   8        3        5