【问题标题】:Pandas adding difference rows by groups熊猫按组添加差异行
【发布时间】:2018-02-12 19:12:28
【问题描述】:

我有一个给定的df:

ID Name  Alias  Ttl Value 
1  abc    A     10    2
1  abc    B     10    3
1  abc    C     10    1
1  ijk    A      5    2
1  ijk    B      5    2
2  ijk    A      5    2
2  ijk    B      5    2

我想按 ID 和名称为每个组插入一个“剩余”行。我的意思是:

输出:

ID Name  Alias  Ttl Value 
1  abc    A     10    2
1  abc    B     10    3
1  abc    C     10    1
1  abc    Z     10    4   <---10 - (2+3+1)
1  ijk    A      5    2
1  ijk    B      5    2
1  ijk    Z      5    1   <---5 - (2+2)
2  ijk    A      5    2
2  ijk    B      5    2   
2  ijk    Z      5    1   <---5 - (2+2)

我不确定如何解决这个问题。在python中有可能吗?

非常感谢!

【问题讨论】:

    标签: pandas row difference


    【解决方案1】:

    这是你需要的吗?

    df.append((df.groupby(['ID','Name']).\
                 apply(lambda x : x['Ttl'].head(1)-
              sum(x['Value']))).\
                   reset_index().\
                     drop('level_2',1).rename(columns={'Ttl':'Value'})).\ 
                        fillna({'Alias':'Z'}).\
                           sort_values(['ID','Name']).\
                                ffill()
    Out[446]: 
      Alias  ID Name   Ttl  Value
    0     A   1  abc  10.0      2
    1     B   1  abc  10.0      3
    2     C   1  abc  10.0      1
    0     Z   1  abc  10.0      4
    3     A   1  ijk   5.0      2
    4     B   1  ijk   5.0      2
    1     Z   1  ijk   5.0      1
    5     A   2  ijk   5.0      2
    6     B   2  ijk   5.0      2
    2     Z   2  ijk   5.0      1
    

    【讨论】:

    • 这正是我所需要的。 :)
    • @TylerNG yw :-) 快乐编码
    【解决方案2】:

    您可以使用pd.concat、groupby、agg 和eval:

    (pd.concat([df,
               df.groupby(['ID','Name'])['Ttl','Value']
                 .agg({'Ttl':'first','Value':'sum'})
                 .eval('Value = Ttl - Value').reset_index()])
      .sort_values(['ID','Name'])
      .fillna('Z'))
    

    输出:

      Alias  ID Name  Ttl  Value
    0     A   1  abc   10      2
    1     B   1  abc   10      3
    2     C   1  abc   10      1
    0     Z   1  abc   10      4
    3     A   1  ijk    5      2
    4     B   1  ijk    5      2
    1     Z   1  ijk    5      1
    5     A   2  ijk    5      2
    6     B   2  ijk    5      2
    2     Z   2  ijk    5      1
    

    【讨论】:

    • 不知道为什么会出现这个错误:AttributeError: 'NoneType' object has no attribute 'reset_index' 但这里的逻辑非常简单和有用
    • 也许是熊猫版?你和温有一个很好的答案。编码愉快。
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2014-06-02
    • 2013-08-13
    • 2020-12-06
    相关资源
    最近更新 更多