【问题标题】:calculate row difference groupwise in pandas在熊猫中按组计算行差异
【发布时间】:2017-05-13 13:17:44
【问题描述】:

我需要使用 pandas 分组计算两行之间的差异。

| Group | Value | ID |
----------------------
|  M1   | 10    | F1 |
----------------------
|  M1   | 11    | F2 |
----------------------
|  M1   | 12    | F3 |
----------------------
|  M1   | 15    | F4 |
----------------------

示例输出:

----------------------
|  M1   | F3 - F2 | 1 |
----------------------
|  M1   | F4 - F1 | 5 |

要计算总和,我会使用 pandas.groupby('Group').sum(),但是如何计算行顺序很重要的行之间的差异?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    我认为您需要带有apply 的自定义函数,它为每个组返回DataFrame,用于按位置选择iat

    def f(x):
        #print (x)
        a = x['Value'].iat[2] - x['Value'].iat[1]
        b = x['Value'].iat[3] - x['Value'].iat[0]
        c = x['ID'].iat[2] + ' - ' + x['ID'].iat[1]
        d = x['ID'].iat[3] + ' - ' + x['ID'].iat[0]
        return pd.DataFrame({'Value': [a,b], 'ID':[c,d]})
    
    df = df.groupby('Group').apply(f).reset_index(level=1, drop=True).reset_index()
    print (df)
    
      Group       ID  Value
    0    M1  F3 - F2      1
    1    M1  F4 - F1      5
    

    【讨论】:

    • 感谢您为我指明了正确的方向。这将如何更新以按 ID 值选择,例如"F2" 与它们相反,即 iat[2]
    • 总是在每个组F1 - F4?
    • 如果每个组中总是F1 使用e = x.loc[x['ID'] == 'F1', 'Value'].item(),如果在某些组中有时缺少F1 e = x.loc[x['ID'] == 'F1', 'Value'] 然后e = np.nan if e.empty else e.item() 会有点复杂
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 2015-03-26
    • 2020-03-01
    • 2021-01-05
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多