2015-06-18 27 views
21

मैं एक dataframe कि कॉलमसमूह सूचकांक द्वारा + पांडा में स्तंभ

  1. user_id
  2. item_bought

यहाँ user_id df के सूचकांक है की है। मैं user_id और item_bought दोनों द्वारा समूह करना चाहता हूं और उपयोगकर्ता के लिए आइटम वार गिनती प्राप्त करना चाहता हूं। मैं उसको कैसे करू।

धन्यवाद

+5

आप' df.groupby ऐसा करने में सक्षम होना चाहिए ([df.index , 'item_bought']) लागू करें (pd.Series.count (level = 0)) ', वास्तव में' df.groupby नहीं है ([df.index, 'item_bought'])। गिनती() 'आपको वह चाहिए जो आप चाहते हैं? – 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

यह दिखाता है कि किसी इंडेक्स + कॉलम से गणना कैसे प्राप्त करें ... आपके उदाहरण में 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 से स्तंभों में से एक का उपयोग कर एक ही समस्या थी। multiindex के साथ, आप उपयोग नहीं कर सकते df.index.levels [0] के बाद से यह है कि विशेष रूप सूचकांक स्तर से ही अलग-अलग मान है और पूरे dataframe से अलग आकार के सबसे अधिक संभावना हो जाएगा ...

जांच 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 
संबंधित मुद्दे