【问题标题】:How to loop through columns of two dataframes, group by key & perform calculation如何遍历两个数据框的列,按键分组并执行计算
【发布时间】:2020-03-22 05:30:36
【问题描述】:

我有两个包含大约 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 元素(我认为),我正在苦苦挣扎。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你能做到吗?:

    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 列,因此使用第二个选项是不可行的,但只要所有列都包含数字,第一个选项就可以工作。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2022-01-12
    • 2018-04-10
    • 2019-12-13
    • 2023-01-18
    • 2019-12-19
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多