【问题标题】:pandas add new row based on sum/difference of other rows熊猫根据其他行的总和/差异添加新行
【发布时间】:2019-08-06 14:30:29
【问题描述】:

df 有

id    measure   t1  t2  t3
1     savings   1    2   5
1     income    10   15  14
1     misc       5    5   5
2     savings    3   6   12
2     income     4   20  80
2     misc       1   1    1

df 想要为每个 id 的度量添加一个新行,称为支出,通过减去 measure=income - measure=savings 来计算,对于每个 id 的每个时期 t1,t2,t3

id    measure   t1  t2  t3
1     savings   1    2   5
1     income    10   15  14
1     misc      5     5   5
1     spend     9    13  9
2     savings    3   6   12
2     income     4   20  80
2     misc       1    1   1
2     spend      1   14  68

尝试:

df.loc[df['Measure'] == 'spend'] =          
                        df.loc[df['Measure'] == 'income']-
                        (df.loc[df['Measure'] == 'savings'])

失败是因为我没有合并 groupby 以获得期望的结果

【问题讨论】:

    标签: python pandas dataframe sum difference


    【解决方案1】:

    这是使用groupby diff 的一种方式

    df1=df[df.measure.isin(['savings','spend'])].copy()
    
    s=df1.groupby('id',sort=False).diff().dropna().assign(id=df.id.unique(),measure='spend')
    df=df.append(s,sort=True).sort_values('id')
    df
    Out[276]: 
       id  measure    t1    t2    t3
    0   1  savings   1.0   2.0   5.0
    1   1   income  10.0  15.0  14.0
    1   1    spend   9.0  13.0   9.0
    2   2  savings   3.0   6.0  12.0
    3   2   income   4.0  20.0  80.0
    3   2    spend   1.0  14.0  68.0
    

    更新

    df1=df.copy()
    df1.loc[df.measure.ne('income'),'t1':]*=-1
    s=df1.groupby('id',sort=False).sum().assign(id=df.id.unique(),measure='spend')
    df=df.append(s,sort=True).sort_values('id')
    

    【讨论】:

    • 更新问题——只需要减去衡量收入和储蓄,其他衡量保持不变
    • diff 仅在我总是只有 2 行要减去时才有效。如果我想将收入储蓄杂项作为支出,有没有一种简单的方法来更新代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2017-01-14
    • 2017-11-03
    • 2019-09-11
    相关资源
    最近更新 更多