2015-06-18 3 views
21

У меня есть dataframe, который имеет столбцыGroup по индексу + колонки в панд

  1. user_id
  2. item_bought

Здесь user_id является индекс ФР. Я хочу сгруппировать как user_id, так и item_bought и получить элемент разумного подсчета для пользователя. Как это сделать.

Благодаря

+5

Вы должны быть в состоянии сделать' df.groupby ([df.index , 'item_bought']). apply (pd.Series.count (level = 0)) ', на самом деле не' df.groupby ([df.index, 'item_bought']). Count() 'дает вам то, что вы хотите? – EdChum

+0

Почему бы вам не использовать этот ответ? – vumaasha

+0

Я получаю сообщение об ошибке, когда пытаюсь группировать [df.index, '']: Группировка и ось должны быть одинаковой длины – codekitty

ответ

1
import pandas as pd 

import numpy as np 

In [11]: 

df = pd.DataFrame() 

In [12]: 

df['user_id'] = ['b','b','b','c'] 

In [13]: 

df['item_bought'] = ['x','x','y','y'] 

In [14]: 

df['ct'] = 1 

In [15]: 

df 

Out[15]: 
    user_id  item_bought  ct 
0 b x 1 
1 b x 1 
2 b y 1 
3 c y 1 
In [16]: 

pd.pivot_table(df,values='ct',index=['user_id','item_bought'],aggfunc=np.sum) 

Out[16]: 

user_id item_bought 
b  x    2 
     y    1 
c  y    1 
+0

Почему это downvoted? Он делает именно то, что они хотят. – howMuchCheeseIsTooMuchCheese

+0

он не показывает, как получить из индекса + столбец в counts ... в вашем примере user_id - это столбец – codekitty

+0

, просто сбросьте индекс 'df = df.reset_index()' ... тогда вы можете его использовать в стержне – howMuchCheeseIsTooMuchCheese

25

это должно работать:

>>> df = pd.DataFrame(np.random.randint(0,5,(6, 2)), columns=['col1','col2']) 
>>> df['ind1'] = list('AAABCC') 
>>> df['ind2'] = range(6) 
>>> df.set_index(['ind1','ind2'], inplace=True) 
>>> df 

      col1 col2 
ind1 ind2    
A 0  3  2 
    1  2  0 
    2  2  3 
B 3  2  4 
C 4  3  1 
    5  0  0 


>>> df.groupby([df.index.get_level_values(0),'col1']).count() 

      col2 
ind1 col1  
A 2  2 
    3  1 
B 2  1 
C 0  1 
    3  1 

Я имел такую ​​же проблему, используя один из столбцов из мультииндекса. с multiindex, вы не можете использовать df.index.levels [0], так как он имеет только отличные значения от этого конкретного уровня индекса и будет, скорее всего, разного размера, чем целая дата-карта ...

check http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_level_values.html - get_level_values ​​"Обратный вектор значений меток для запрашиваемого уровня, равной длине индекса»

18

с версии 0.20.1 это проще:

Strings passed to DataFrame.groupby() as the by parameter may now reference either column names or index level names

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], 
      ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']] 

index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second']) 

df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3], 
        'B': np.arange(8)}, index=index) 

print (df) 

       A B 
first second  
bar one  1 0 
     two  1 1 
baz one  1 2 
     two  1 3 
foo one  2 4 
     two  2 5 
qux one  3 6 
     two  3 7 

print (df.groupby(['second', 'A']).sum()) 
      B 
second A 
one 1 2 
     2 4 
     3 6 
two 1 4 
     2 5 
     3 7 
Смежные вопросы