पंडों की गिनती (विशिष्ट) समकक्ष


289

मैं पंडों को एक db विकल्प के रूप में उपयोग कर रहा हूं क्योंकि मेरे पास कई डेटाबेस (oracle, mssql, आदि) हैं और मैं SQL समतुल्य आदेशों का अनुक्रम बनाने में असमर्थ हूं।

मेरे पास DataFrame में कुछ कॉलम के साथ एक टेबल भरी हुई है:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

SQL में, प्रति वर्ष विभिन्न ग्राहकों की राशि की गणना करने के लिए होगा:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

और परिणाम होगा

201301    5000
201302    13245

मैं पंडों में कैसे कर सकता हूं?


मैंने Table.groupby (['YEARMONTH')] ['CLIENTCODE'] किया है। अद्वितीय () और YEARMONTH द्वारा अनुक्रमित दो श्रृंखलाओं के साथ और सभी अद्वितीय मूल्यों के साथ आया है। प्रत्येक श्रृंखला पर मूल्यों की मात्रा कैसे गिना जाए?
एड्रियानो अलमेडा

कुछ के लिए, value_countsआप जिस उत्तर की तलाश में हैं , वह हो सकता है: pandas.pydata.org/pandas-docs/stable/generated/…
sachinruk

जवाबों:


434

मेरा मानना ​​है कि यह वही है जो आप चाहते हैं:

table.groupby('YEARMONTH').CLIENTCODE.nunique()

उदाहरण:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

2
क्या होगा यदि मेरे पास एक से अधिक कॉलम हैं, जिन्हें मैं एक साथ अद्वितीय होना चाहता हूं, जैसे कि।
अर्नेस्टस्क्राइब्लर

4
इस अनूठी गणना का उपयोग कैसे करें। जैसा कि कोई कॉलम नाम नहीं है
तरुण खनेजा

बहुत बहुत धन्यवाद, मैंने इस शैली का उपयोग resample के आउटपुट पर किया। df_watch_record.resample ('M')। user.nunique () प्रति माह मूवी देखने वाले अद्वितीय उपयोगकर्ताओं की संख्या को गिनाता है।
मेहदी काज़ेमी

1
और उन्हें table.groupby ('YEARMONTH') के साथ क्रमबद्ध करें। CLIENTCODE.nique ()। Sort_values ​​(आरोही = गलत)
wllbll

क्या समूह पहचानकर्ता को फिर से प्राप्त करना संभव है nunique? कोशिश करो कि मैं एक रास्ता न पा सकूँ, क्योंकि इस उत्तर का परिणाम एक है Series, एक नहीं DataFrame
जोश हेन्सन

93

यहाँ एक और तरीका है, बहुत सरल है, जो कहता है कि आपका डेटाफ्रेम नाम है daatऔर कॉलम नाम हैYEARMONTH

daat.YEARMONTH.value_counts()

1
मुझे यह उत्तर पसंद है। यदि मेरे कॉलम का नाम 'है' तो मैं इस पद्धति का उपयोग कैसे कर सकता हूं। इसमें (उदाहरण के लिए 'ck.Class')? धन्यवाद

5
daat ['ck.Class']। value_counts ()
स्टेटग्यूसर

28
यह पूछे गए प्रश्न को संबोधित नहीं करता है।
एरोन शूमाकर

6
यह प्रत्येक समूह के भीतर टिप्पणियों की संख्या की गणना करता है, न कि प्रत्येक समूह के एक विशिष्ट कॉलम का अद्वितीय मूल्य।
जेसन गोल

2
यह गलत उत्तर है; यह DISTINCTप्रश्न से आवश्यकता को नहीं दर्शाता है ! इसके अलावा, इसमें शामिल नहीं हैं NaN!
कोरी लेविंसन

47

दिलचस्प रूप से पर्याप्त है, बहुत बार len(unique())की तुलना में कुछ गुना (3x-15x) तेज है nunique()


11
आपका मतलब इससे है? .CLIENTCODE.apply(lambda x: len(x.unique())), यहां से
user4015990

6
@ user32185 आपको इसे लैम्बडा के applyसाथ कॉल में छोड़ना होगा । उदाहरण के लिए, df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0])
3novak

3
सिंटैक्स पूरी तरह से स्पष्ट नहीं है, मैंने len(df['column'].unique())
लैंबडा

मुझे मिल गया TypeError: object of type 'method' has no len()से Chen'sटिप्पणी, 3novak'sमेरे लिए काम किया।
जेसन गोल

4

का उपयोग करते हुए crosstab, इससे अधिक जानकारी वापस आ जाएगीgroupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

थोड़ा संशोधित करने के बाद, परिणाम प्राप्त करें

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

मैं कैसे दो स्तंभ के रूप में यह निर्यात कर सकते हैं YEARMONTHऔर count। क्या मैं गिनती को अवरोही क्रम में भी सेट कर सकता हूं?
मुर्तजा हाजी

3

मैं भी उपयोग कर रहा हूं nuniqueलेकिन यह बहुत उपयोगी होगा यदि आपको किसी कुल फ़ंक्शन का उपयोग करना है जैसे कि 'min', 'max', 'count' or 'mean'आदि।

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

0

नए पांडा संस्करण के साथ, डेटाफ्रेम के रूप में प्राप्त करना आसान है

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

0

यहां एक दृष्टिकोण कई कॉलमों पर अलग-अलग है। चलो कुछ डेटा है:

data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
        'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
        'PRODUCT_CODE': [100,150,220,400,50,80,100]
       }
table = pd.DataFrame(data)
table

CLIENT_CODE YEAR_MONTH  PRODUCT_CODE
0   1       201301      100
1   1       201301      150
2   2       201301      220
3   1       201302      400
4   2       201302      50
5   2       201302      80
6   3       201302      100

अब, ब्याज के कॉलम को सूचीबद्ध करें और समूह को थोड़ा संशोधित सिंटैक्स में उपयोग करें:

columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()

हमने प्राप्त किया:

YEAR_MONTH  PRODUCT_CODE CLIENT_CODE        
1           2            3
2           2            3
3           1            1

0

अन्य स्तंभों पर एकत्रीकरण के साथ स्तंभ का अंतर

किसी भी स्तंभ ( CLIENTCODEआपके मामले में) के लिए विशिष्ट मान प्राप्त करने के लिए , हम उपयोग कर सकते हैं nunique। हम इनपुट को aggफ़ंक्शन में एक डिक्शनरी के रूप में , अन्य कॉलम पर एकत्रीकरण के साथ पास कर सकते हैं:

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# if you wish to reset the index
grp_df.reset_index(inplace=True)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.