Python 如何循环两个数据帧的列,按键分组&;计算

Python 如何循环两个数据帧的列,按键分组&;计算,python,pandas,Python,Pandas,我有两个数据框,大约有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

我有两个数据框,大约有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
我正在使用下面的代码(改编自),它创建了一个将ID映射到凹陷总和的序列,然后将这些总和映射到df1中的ID,并从凹陷中减去

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
i、 e.凹陷栏中的差异。我无法解决如何将其应用于数据帧中的每一列。我曾尝试在列名上编写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'])) 

我希望其中一个有帮助

是的,这很有效!真不敢相信我不知道。sub,简单多了。这意味着我必须在运行之前删除任何包含字符串的列,有没有办法解决这个问题?你知道吗?我更新了答案,如果你需要我扩展任何列,请告诉我,谢谢!idk,你也许可以做一个正则表达式列删除,但我会在旁边研究一下,非常感谢。因为我的实际df中有大约300列,所以使用第二个选项是不可行的,但是只要所有列都包含数字,第一个选项就可以工作。