2017-01-21 13 views
5

शायद मुझे स्पष्ट याद आ रही है।पांडा: सूची के प्रत्येक तत्व पर समूहby का प्रयोग करें

id  product    categories 
    0  Silmarillion   ['Book', 'Fantasy'] 
    1  Headphones   ['Electronic', 'Material'] 
    2  Dune     ['Book', 'Sci-Fi'] 

मैं श्रेणियों स्तंभ में प्रत्येक तत्व उसकी उपस्थिति की संख्या गिनने के लिए GroupBy समारोह का उपयोग करना चाहते हैं, तो यहाँ परिणाम होगा:

मैं एक पांडा dataframe है कि इस तरह दिखता है

Book  2 
Fantasy 1 
Electronic 1 
Material 1 
Sci-Fi  1 

हालांकि जब मैं एक GroupBy समारोह का उपयोग करके देखें, पांडा के बजाय पूरी सूची उसके तत्वों को अलग करने की घटनाओं को गिना जाता है। मैंने tuples या splits का उपयोग करके, इसे संभालने के कई अलग-अलग तरीकों का प्रयास किया है, लेकिन अब तक मैं असफल रहा हूं।

+3

परीक्षण: पांडा पूरी तरह से इस बिंदु पर गैर अदिश प्रविष्टियों का समर्थन नहीं करता है, और जब उन्हें प्रयोग आप कभी कभी रहस्यमय विफलताओं मिल सकती है। आमतौर पर अपने फ्रेम को फिर से काम करना सुरक्षित होता है ताकि प्रत्येक पंक्ति में केवल स्केलर प्रविष्टियां हों। – DSM

उत्तर

5

आप को रखना, उन्हें तो value_counts() फोन द्वारा रिकॉर्ड को सामान्य कर सकते हैं:

pd.DataFrame(df['categories'].tolist()).stack().value_counts() 
Out: 
Book   2 
Fantasy  1 
Material  1 
Sci-Fi  1 
Electronic 1 
dtype: int64 
4

इस प्रयास करें:

In [58]: df['categories'].apply(pd.Series).stack().value_counts() 
Out[58]: 
Book   2 
Fantasy  1 
Electronic 1 
Sci-Fi  1 
Material  1 
dtype: int64 
+0

@ayhan, आपने अपना समाधान क्यों हटा दिया? मुझे लगता है कि यह मेरे – MaxU

+0

से बेहतर था एक आकर्षण की तरह काम करता है, धन्यवाद! – Skum

+0

@MaxU '.apply (pd.Series)' pd.DataFrame (ser.tolist()) 'से अधिक स्पष्ट लग रहा था। मेरा एक दुष्प्रभाव की तरह दिखता है जो भविष्य में काम नहीं कर सकता है। – ayhan

5

तुम भी एक सूची पर सीधे pd.value_counts कॉल कर सकते हैं।
आप numpy.concatenate के माध्यम से उचित सूची उत्पन्न कर सकते हैं, itertools.chain, या cytoolz.concat

from cytoolz import concat 
from itertools import chain 

cytoolz.concat

pd.value_counts(list(concat(df.categories.values.tolist()))) 

itertools.chain

pd.value_counts(list(chain(*df.categories.values.tolist()))) 

numpy.unique + numpy.concatenate

u, c = np.unique(np.concatenate(df.categories.values), return_counts=True) 
pd.Series(c, u) 

सभी उपज

Book   2 
Electronic 1 
Fantasy  1 
Material  1 
Sci-Fi  1 
dtype: int64 

समय एक तरफ

enter image description here

+1

वाह! यह तेज़ है! – MaxU

+1

धन्यवाद @ निकिलमेवेली ... मुझे याद आया ;-) – piRSquared

+0

मुझे यह भ्रम उत्पन्न होता है ;-) –

संबंधित मुद्दे