Pandas按组添加差异行

时间:2018-02-12 19:12:28

标签: pandas row difference

我有一个给定的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中有可能吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

这是你需要的吗?

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

答案 1 :(得分:2)

您可以使用pd.concatgroupbyaggeval

(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