Скользящая сумма всех значений, связанных с идентификаторами из двух столбцов - PullRequest
0 голосов
/ 31 октября 2018

Как правило, я хочу сгруппировать все идентификаторы из двух столбцов (['id1', 'id2]) и получить скользящую сумму (из последних 2 строк) их соответствующих значений из столбцов [' value1 ',' значение2' ]

ДФ:

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') - просто для упрощения я показываю только с идентификатором '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']):

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), так как исходный набор данных имеет сотни идентификаторов для вычисления.

1 Ответ

0 голосов
/ 31 октября 2018

Reconfigure

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

Shuffle Stuff About

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...