Суммирование или группирование на разных уровнях со столбцами MultiIndex? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть фрейм данных, где, чтобы избежать имен столбцов кортежей, я намеренно использовал пустые уровни:

>>> df
      user1 user2 count
                   0      1             2
                   a      a      b      a 
    0  2     6     0      1      0      0
    1  4     6     0      0      0      3
    2  21    76    2      0      1      0
    3  5     18    0      0      0      0

Обратите внимание, что user1 и user2 находятся на том же уровне, что и count (побочный эффект слияния).

Я хочу иметь новый столбец (может быть, под count?), Который принимает сумму, скажем, всех 1 и 2 (0 не включены! ) для каждое письмо Это будет означать:

>>> df
      user1 user2 count
                   0      1             2       sum_1_2
                   a      a      b      a       a        b
    0  2     6     0      1      0      0       1+0      0
    1  4     6     0      0      0      3       0        0+3
    2  21    76    2      0      1      0       0        0
    3  5     18    0      0      0      0       0        0

Я пробовал df.groupby(level=[0,2]).sum(), основываясь на этой теме , но они не дают мне желаемых результатов (они включают столбец 0 в сумму, а также сумму * 1022) * и user2).

КОД ГЕНЕРАТОРА:

df = pd.DataFrame({'user1':[2,4,21,21],'user2':[6,6,76,76],'param1':[1,2,0,1],'param2':['a','a','a','b'],'count':[1,3,2,1]}, columns=['user1','user2','param1','param2','count'])
df = df.set_index(['user1','user2','param1','param2'])
df = df.unstack([2,3]).sort_index(axis=1).reset_index()

df2 = pd.DataFrame({'user1':[2,5,21],'user2':[6,18,76]})
df2.columns = pd.MultiIndex.from_product([df2.columns, [''],['']])
final_df = df2.merge(df, on=['user1','user2'], how='outer').fillna(0)

1 Ответ

0 голосов
/ 05 сентября 2018

Сначала используйте слайсеры только для фильтра 1,2, затем sum и добавьте уровни для тех же уровней, что и оригинал DataFrame для возможного использования concat:

idx = pd.IndexSlice
df3 = final_df.loc[:, idx[:, [1,2],:]].sum(level=2, axis=1)
df3.columns = pd.MultiIndex.from_product([['count'], ['sum_1_2'], df3.columns])
print (df3)
    count     
  sum_1_2     
        a    b
0     1.0  0.0
1     0.0  0.0
2     0.0  1.0
3     3.0  0.0

df = pd.concat([final_df, df3], axis=1)
print (df)
  user1 user2 count                            
                  0    1         2 sum_1_2     
                  a    a    b    a       a    b
0     2     6   0.0  1.0  0.0  0.0     1.0  0.0
1     5    18   0.0  0.0  0.0  0.0     0.0  0.0
2    21    76   2.0  0.0  1.0  0.0     0.0  1.0
3     4     6   0.0  0.0  0.0  3.0     3.0  0.0

Detail

print (final_df.loc[:, idx[:, [1,2],:]])
  count          
      1         2
      a    b    a
0   1.0  0.0  0.0
1   0.0  0.0  0.0
2   0.0  1.0  0.0
3   0.0  0.0  3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...