python - 如何遍历两个数据框的列,按键分组并执行计算
问题描述
我有两个包含大约 300 列的数据框,其中包含干预前和干预后的分数。我需要为每个具有单个 ID 的参与者计算每列中前后之间的差异。作为一个小例子,我有:
Pre-intervention:
ID DEPRESSION ANXIETY COGNITION
0 001 10 2 6
1 002 15 12 -3
2 003 14 -2 6
3 004 14 1 2
Post-intervention:
ID DEPRESSION ANXIETY COGNITION
0 001 9 3 10
1 002 6 -5 2
2 003 14 8 -3
3 004 2 11 2
我正在使用下面的代码(改编自Using two dataframes to calculate final value pandas),它创建一个序列映射 ID 到 DEPRESSION 的总和,然后将这些总和映射到 df1 中的 ID 并从 DEPRESSION 中减去。
s = df1.groupby('ID')['DEPRESSION'].sum()
df2['DEPRESSION'] = df2['DEPRESSION'] - df2['ID'].map(s).fillna(0)
这给了我:
ID DEPRESSION ANXIETY COGNITION
0 001 -1 3 10
1 002 -9 -5 2
2 003 0 8 -3
3 004 -12 11 2
即凹陷列的差异。我无法弄清楚如何将其应用于我的数据框中的每一列。我曾尝试在列名上编写一个 for 循环,但由于该groupby
元素(我认为)而我正在苦苦挣扎。
非常感谢任何帮助。
解决方案
你可以做?:
newdf = df2.sub(df1, fill_value=0)
newdf['ID'] = df1['ID']
您也可以通过以下两种方式进行操作:
逐个
newdf['ID'] = df1['ID']
newdf['DEPRESSION'] = df2['DEPRESSION'] - df1['DEPRESSION']
newdf['ANXIETY'] = df2['ANXIETY'] - df1['ANXIETY']
newdf['COGNITION'] = df2['COGNITION'] - df1['COGNITION']
或者使用 sub 构建列,删除它们。您可以在 columns= 内使用 ['col1', 'col2'] 但在此处使用列名而不是 col1, col2:
df2.drop(columns=['col1', 'col2']).sub(df1.drop(columns=['col1', 'col2']))
我希望其中之一有帮助
推荐阅读
- javascript - Javascript Try Catch 与 Catch 链
- html - html在双引号中时如何定义样式属性(作为字符串)
- php - 如果邮递员的请求返回 HTML 正文,这意味着什么?
- python - 无法列出 pytorch 网络的参数
- http - 使用 nginx 进行反向代理
- typescript - TypeScript 泛型与 Java 有何不同?
- r - 如何识别 R 中所有列的具有相同值的行号?
- raspberry-pi - 机器人迷宫树莓派
- xcode - 如何在 SwiftUI for WatchOS6 中获取涂鸦输入
- c# - 我可以在泛型类型类中有不同的泛型类型方法吗