2015-05-28 8 views
13

मैं पांडों का उपयोग करके प्रत्येक कॉलम में अलग-अलग मानों की गिनती खोजने की कोशिश कर रहा हूं। यह जो मैंने किया है।प्रत्येक कॉलम में डेटाफ्रेम में विशिष्ट तत्वों की गिनती

import pandas as pd 

df = pd.read_csv('train.csv') 
# print(df) 

a = pd.unique(df.values.ravel()) 
print(a) 

यह DataFrame पंक्तियों/स्तंभों पर ध्यान दिए बिना में अद्वितीय तत्व में गिना जाता है, लेकिन मैं नीचे के रूप में स्वरूपित उत्पादन के साथ प्रत्येक स्तंभ के लिए गिनती की जरूरत है।

policyID    0 
statecode    0 
county    0 
eq_site_limit   0 
hu_site_limit   454 
fl_site_limit   647 
fr_site_limit   0 
tiv_2011    0 
tiv_2012    0 
eq_site_deductible 0 
hu_site_deductible 0 
fl_site_deductible 0 
fr_site_deductible 0 
point_latitude  0 
point_longitude  0 
line     0 
construction   0 
point_granularity  0 

ऐसा करने का सबसे प्रभावी तरीका क्या होगा, क्योंकि यह विधि 1.5 जीबी से अधिक आकार वाली फ़ाइलों पर लागू होगी?


जवाब के आधार पर, df.apply(lambda x: len(x.unique())) सबसे तेज है।

In[23]: %timeit df.apply(pd.Series.nunique) 
1 loops, best of 3: 1.45 s per loop 
In[24]: %timeit df.apply(lambda x: len(x.unique())) 
1 loops, best of 3: 335 ms per loop 
In[25]: %timeit df.T.apply(lambda x: x.nunique(), axis=1) 
1 loops, best of 3: 1.45 s per loop 

उत्तर

16

आप df के पक्षांतरित और फिर apply कॉल nunique पंक्ति-वार का उपयोग कर कर सकता है:

In [205]: 
df = pd.DataFrame({'a':[0,1,1,2,3],'b':[1,2,3,4,5],'c':[1,1,1,1,1]}) 
df 

Out[205]: 
    a b c 
0 0 1 1 
1 1 2 1 
2 1 3 1 
3 2 4 1 
4 3 5 1 

In [206]: 
df.T.apply(lambda x: x.nunique(), axis=1) 

Out[206]: 
a 4 
b 5 
c 1 
dtype: int64 

संपादित

रूप @ajcr पक्षांतरित द्वारा बताया अनावश्यक है:

In [208]: 
df.apply(pd.Series.nunique) 

Out[208]: 
a 4 
b 5 
c 1 
dtype: int64 

पांडा 0.20 के रूप में हम dataframe अर्थात पर सीधे nunique उपयोग कर सकते हैं

df.nunique() 
a 4 
b 5 
c 1 
dtype: int64 
+5

इसी प्रकार मुझे लगता है कि 'df.apply (pd.Series.nunique)' भी काम करेगा (और यदि यह कोई समस्या है तो इसे स्थानांतरित करने की आवश्यकता से बचें) । –

+0

@ajcr हां वास्तव में बेहतर है, शुरुआत में मैंने सोचा था कि स्तंभों को इंडेक्स मानों के रूप में प्राप्त करने के लिए स्थानांतरण आवश्यक था – EdChum

+0

अद्वितीय अवसरों की कुल संख्या को कैसे गिनें? –

2

एक Pandas.Series एक .value_counts() समारोह वास्तव में प्रदान करता है कि आप क्या करना चाहते है। Check out the documentation for the function

+0

क्या आप दिखा सकते हैं कि यह कैसे दिखाई देगा जैसा आपने कोई कोड और आउटपुट पोस्ट नहीं किया है – EdChum

0

हाल ही में, मैं DataFrame के प्रत्येक कॉलम का अनूठा मूल्य की गिनती का एक ही मुद्दे हैं, और मैं कुछ अन्य समारोह है कि तेजी से apply समारोह से चलाता पाया:

#Select the way how you want to store the output, could be pd.DataFrame or Dict, I will use Dict to demonstrate: 
col_uni_val={} 
for i in df.columns: 
    col_uni_val[i] = len(df[i].unique()) 

#Import pprint to display dic nicely: 
import pprint 
pprint.pprint(col_uni_val) 

यह मेरे लिए काम करता लगभग दो बार से अधिक तेजी से df.apply(lambda x: len(x.unique()))

df.apply(lambda x: x.nunique()) 

और भी बेहतर:

0

पहले से ही यहाँ कुछ महान जवाब :) लेकिन इस एक कमी रह गई है समाचार, DataFrame.nunique() संस्करण 0.20.0: github of this issue

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