Группировка по всем категориям, агрегирование по функции и заполнение полученных NA в пандах - PullRequest
1 голос
/ 12 марта 2019

У меня следующая проблема.

mtx =[['0','q'],
      ['0','e'],
      ['1','q'],
      ['1','w'],
      ['2','r'],
      ['2','e'],
      ['2','w'],
      ['3','t'],
      ['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
                    columns=['id','cat','val'])

Я хочу

  1. сгруппировать его по id и cat ,
  2. имеет все возможные кошка , присутствующие в результате для каждого id ,
  3. применения функции (скажем, sum )на val ,
  4. для отсутствующих (id, cat) комбинации заполняются 0с.

т.е. результат будет иметь следующую форму.

mtx1 = [[el1, el] for el in 'qwerty' for el1 in '01234']
df11 = pd.DataFrame(np.insert(mtx1, 2, '-', axis=1), 
                    columns=['id','cat','val'])
>>>
[['0' 'q' '-']
 ['1' 'q' '-']
 ['2' 'q' '-']
 ['3' 'q' '-']
 ['4' 'q' '-']
 ['0' 'w' '-']
 ['1' 'w' '-']
 ['2' 'w' '-']
 ['3' 'w' '-']
 ['4' 'w' '-']
 ['0' 'e' '-']
 ['1' 'e' '-']
 ['2' 'e' '-']
 ['3' 'e' '-']
 ['4' 'e' '-']
 ['0' 'r' '-']
 ['1' 'r' '-']
 ['2' 'r' '-']
 ['3' 'r' '-']
 ['4' 'r' '-']
 ['0' 't' '-']
 ['1' 't' '-']
 ['2' 't' '-']
 ['3' 't' '-']
 ['4' 't' '-']
 ['0' 'y' '-']
 ['1' 'y' '-']
 ['2' 'y' '-']
 ['3' 'y' '-']
 ['4' 'y' '-']]

Для - должен быть результат применения func ИЛИ 0.Можно ли идиоматически выполнить такую ​​операцию в пандах?с .groupby?Я могу думать только о том, чтобы вручную создать перекрестное произведение, а затем проверить оригинал df10, если комбинация существует, и затем применить func или вставить 0 при наличии комбинации в оригинале df.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Первый агрегат sum для MultiIndex Series, создайте все возможные комбинации с помощью MultiIndex.from_product, используйте Series.reindex для добавления пропущенных значений, заполненных 0 при необходимости Series.sort_index и последний Series.reset_index:

np.random.seed(2019)

mtx =[['0','q'],
      ['0','e'],
      ['1','q'],
      ['1','w'],
      ['2','r'],
      ['2','e'],
      ['2','w'],
      ['3','t'],
      ['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
                    columns=['id','cat','val'])
print (df10)
  id cat val
0  0   q   9
1  0   e   3
2  1   q   6
3  1   w   6
4  2   r   8
5  2   e   2
6  2   w   7
7  3   t   9
8  4   y   8

s = df10.groupby(['id','cat'])['val'].sum()
mux = pd.MultiIndex.from_product(s.index.levels, names=s.index.names)
df = s.reindex(mux, fill_value=0).sort_index(level=[1,0]).reset_index()
print (df.head(10))
  id cat val
0  0   e   3
1  1   e   0
2  2   e   2
3  3   e   0
4  4   e   0
5  0   q   9
6  1   q   6
7  2   q   0
8  3   q   0
9  4   q   0
0 голосов
/ 12 марта 2019

Ниже приведен код, который поможет вам достичь желаемых результатов

mtx =[['0','q'],
      ['0','e'],
      ['1','q'],
      ['1','w'],
      ['2','r'],
      ['2','e'],
      ['2','w'],
      ['3','t'],
      ['4','y']]
df10 = pd.DataFrame(np.insert(mtx, 2, np.random.rand(len(mtx))*10, axis=1),
                    columns=['id','cat','val'])
df10.pivot_table(index=['cat'], columns=['id'],values='val',aggfunc=np.sum).fillna(0).stack(['id']).sort_index(level=1).reset_index()
df10.rename(columns={'cat':'cat','id':'id',0:'val'}, inplace=True)
df10

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

df10.pivot_table(index=['cat'], columns=['id'],values='val',aggfunc=np.sum).fillna(0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...