2015-06-18 32 views
21

Tôi có một dataframe đó có các cộtĐoàn tự do chỉ số + cột trong gấu trúc

  1. user_id
  2. item_bought

Đây user_id là chỉ số của df. Tôi muốn nhóm theo cả user_id và item_bought và nhận được số lượng hàng khôn ngoan cho người dùng. Làm thế nào để làm điều đó.

Cảm ơn

+5

Bạn sẽ có thể làm' df.groupby ([df.index , 'item_bought']) áp dụng (pd.Series.count (cấp = 0)) ', thực sự không' df.groupby ([df.index, 'item_bought']). Count() 'cung cấp cho bạn những gì bạn muốn? – EdChum

+0

Tại sao không sử dụng làm cho câu trả lời này? – vumaasha

+0

Tôi gặp lỗi khi cố gắng nhóm theo [df.index, '']: Cá mú và trục phải có cùng độ dài – codekitty

Trả lời

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

Tại sao lại là downvoted? Nó thực hiện chính xác những gì họ muốn. – howMuchCheeseIsTooMuchCheese

+0

nó không hiển thị như thế nào để có được từ một chỉ mục + một cột để đếm ... trong ví dụ của bạn user_id là một cột – codekitty

+0

chỉ cần thiết lập lại các chỉ số 'df = df.reset_index()' ... sau đó bạn có thể sử dụng nó trong một trục – howMuchCheeseIsTooMuchCheese

25

này nên làm việc:

>>> 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 

tôi đã cùng một vấn đề bằng một trong những cột từ multiindex. với multiindex, bạn không thể sử dụng df.index.levels [0] vì nó chỉ có các giá trị riêng biệt từ cấp chỉ mục cụ thể đó và có nhiều khả năng có kích thước khác với toàn bộ khung dữ liệu ...

kiểm tra http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.get_level_values.html - get_level_values ​​"return vector các giá trị nhãn cho mức độ yêu cầu, tương đương với chiều dài của chỉ số"

18

Từ phiên bản 0.20.1 nó là đơn giản hơn:

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 
Các vấn đề liên quan