两列中与ID相关联的所有值的总和

时间:2018-10-31 02:27:17

标签: python pandas pandas-groupby

基本上,我希望它对两列(['id1','id2])中的所有ID进行分组,并从列['value1','中获取其各自值的滚动总和(从过去的2行开始) value2']

df:

id1     id2     value1    value2     
-----------------------------------
a       b       10        5            
c       a       5         10           
b       c       0         0                    
c       d       2         1            
d       a       10        20           
a       c       5         10             
b       a       10        5            
a       b       5         2                      
c       a       2         5            
d       b       5         2     

df(如果df.id ='a')-为简化起见,我仅显示ID为'a':

id1     id2     value1    value2    a.rolling.sum(2)  
-----------------------------------------------------
a       b       10        5         NaN   
c       a       5         10        20             
d       a       10        20        30   
a       c       5         10        25  
b       a       10        5         10
a       b       5         2         10            
c       a       2         5         10    

期望df(包括['id1','id2']列中的所有ID):

id1     id2     value1    value2       a.rolling.sum(2)     b.rolling.sum(2)      c.rolling.sum(2)
---------------------------------------------------------------------------------------------
a       b       10        5            NaN                 NaN               NaN
c       a       5         10           20                  NaN               NaN
b       c       0         0            NaN                 5                 5
c       d       2         1            NaN                 NaN               2
d       a       10        20           30                  NaN               NaN
a       c       5         10           25                  NaN               12
b       a       10        5            10                  10                NaN
a       b       5         2            10                  12                NaN
c       a       2         5            10                  NaN               12
d       b       5         2            NaN                 4                 NaN

优选地,我需要一个groupby函数来分配与x.rolling(2)有关的所有ID,因为原始数据集具有数百个要计算的ID。

1 个答案:

答案 0 :(得分:1)

重新配置

i = df.filter(like='id')
i.columns = [i.columns.str[:2], i.columns.str[2:]]

v = df.filter(like='va')
v.columns = [v.columns.str[:5], v.columns.str[5:]]

d = i.join(v)

d

  id    value    
   1  2     1   2
0  a  b    10   5
1  c  a     5  10
2  b  c     0   0
3  c  d     2   1
4  d  a    10  20
5  a  c     5  10
6  b  a    10   5
7  a  b     5   2
8  c  a     2   5
9  d  b     5   2

随机播放内容

def modified_roll(x):
  return x.dropna().rolling(2).sum()


extra_bit = d.stack().set_index('id', append=True).unstack().value \
             .apply(modified_roll).groupby(level=0).first()

extra_bit

id     a     b     c     d
0    NaN   NaN   NaN   NaN
1   20.0   NaN   NaN   NaN
2    NaN   5.0   5.0   NaN
3    NaN   NaN   2.0   NaN
4   30.0   NaN   NaN  11.0
5   25.0   NaN  12.0   NaN
6   10.0  10.0   NaN   NaN
7   10.0  12.0   NaN   NaN
8   10.0   NaN  12.0   NaN
9    NaN   4.0   NaN  15.0

join

df.join(extra_bit)

  id1 id2  value1  value2     a     b     c     d
0   a   b      10       5   NaN   NaN   NaN   NaN
1   c   a       5      10  20.0   NaN   NaN   NaN
2   b   c       0       0   NaN   5.0   5.0   NaN
3   c   d       2       1   NaN   NaN   2.0   NaN
4   d   a      10      20  30.0   NaN   NaN  11.0
5   a   c       5      10  25.0   NaN  12.0   NaN
6   b   a      10       5  10.0  10.0   NaN   NaN
7   a   b       5       2  10.0  12.0   NaN   NaN
8   c   a       2       5  10.0   NaN  12.0   NaN
9   d   b       5       2   NaN   4.0   NaN  15.0