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
我在 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