Панды группового с MultiIndex столбцов и разных уровней - PullRequest
0 голосов
/ 04 сентября 2018

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

>>> df
      user1 user2 count
                   0             1      2
                   a      x      d      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 (побочный эффект слияния).

Желаемый выход :

  user2 count
        0              1      2
        a       x      d      a 
0  6    0       1      0      1
1  76   1       0      0      0    
3  18   0       0      0      0  

Я пытался

>>> df.groupby(['user2','count'])

но я получаю

ValueError: Grouper for 'count' not 1-dimensional

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

df = pd.DataFrame({'user1':[2,4,21,21],'user2':[6,6,76,76],'param1':[0,2,0,1],'param2':['x','a','a','d'],'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 голосов
/ 04 сентября 2018

IIUC, вы хотите:

final_df.where(final_df>0).groupby('user2').count().drop('user1', axis=1).reset_index()

Выход:

  user2 count         
            0     1  2
            a  x  d  a
0     6     0  1  0  1
1    18     0  0  0  0
2    76     1  0  1  0

Избегайте удаления столбцов, выберите только «количество» и измените функцию на sum:

final_df.where(final_df>0).groupby('user2').sum()[['count']].reset_index()

Выход:

  user2 count               
            0         1    2
            a    x    d    a
0     6   0.0  1.0  0.0  3.0
1    18   0.0  0.0  0.0  0.0
2    76   2.0  0.0  1.0  0.0

Для отмены удаления user2 равным нулю также.

final_df[['count']].where(final_df[['count']]>0)\ .groupby(final_df.user2).sum().reset_index()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...