उस आवृत्ति की गणना करें जो किसी डेटाफ़्रेम कॉलम में होती है


311

मेरे पास एक डेटासेट है

|category|
cat a
cat b
cat a

मैं कुछ वापस करने में सक्षम होना चाहूंगा जैसे (अद्वितीय मान और आवृत्ति दिखाते हुए)

category | freq |
cat a       2
cat b       1

1
कोशिश करेंcollections.Counter
मेटेटास्टर

93
क्या आप ढूंढ रहे हैं df["category"].value_counts()?
DSM

"Df [" श्रेणी "] का उपयोग करते समय। value_counts ()" यह एक int कहता है? लेकिन यह इंडेक्स के रूप में कॉलम का नाम देता है? क्या यह एक डेटाफ्रेम ऑब्जेक्ट है या यह किसी तरह सीरीज़ (काउंट्स) और मूल यूनीक कॉलम वैल्यू को मिला रहा है?
योशिसेरी

@ योशिसेरी यह एक पंडस श्रृंखला है type(df['category'].value_counts())और यह ऐसा कहेगा
एडचम

मैंने किया था, और मैं इससे हैरान था, लेकिन इससे मुझे लगता है कि मैं इसके बारे में अधिक सोचता हूं। ऐसा करने के बाद, मूल्य कुछ कॉलम्स पर गिना जाता है, ऐसी पंक्तियाँ हैं जिन्हें मैं बाहर करना चाहूंगा। मुझे पता है कि कॉलम कैसे हटाएं लेकिन मैं पंक्तियों को कैसे छोड़ूं?
योशिसेरी

जवाबों:


413

उपयोग groupbyऔर count:

In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()

Out[37]:

   a
a   
a  2
b  3
s  2

[3 rows x 1 columns]

ऑनलाइन डॉक्स देखें: http://pandas.pydata.org/pandas-docs/stable/groupby.html

भी value_counts() @DSM टिप्पणी की है के रूप में यहाँ एक बिल्ली त्वचा के लिए, कई मायनों

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

यदि आप transformएक संरेखित सूचकांक को वापस करने के लिए मूल डेटाफ़्रेम उपयोग की आवृत्ति जोड़ना चाहते हैं :

In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df

Out[41]:

   a freq
0  a    2
1  b    3
2  s    2
3  s    2
4  b    3
5  a    2
6  b    3

[7 rows x 2 columns]

@yoshiserry नहीं, आप जो देखते हैं वह यह है कि यह एक श्रृंखला बनाता है जो मूल डेटाफ्रेम के साथ संरेखित होती है, अन्य विधियों के विपरीत जो अद्वितीय मूल्यों और उनकी आवृत्ति को प्रदर्शित करते हैं, अगर आप सिर्फ डेटाफ्रेम में वापस आवृत्ति गिनती जोड़ना चाहते थे, जिसके लिए आप रूपांतरण का उपयोग कर सकते हैं इस। यह सिर्फ एक और तकनीक है, आप ध्यान दें कि यह वापस असाइन करने के बाद डेटाफ्रेम को ढह नहीं रहा है और कोई लापता मान नहीं है। इसके अलावा, मुझे लगता है कि डेटाफ्रेम में हमेशा एक इंडेक्स होता है मुझे नहीं लगता कि आप इससे छुटकारा पा सकते हैं, केवल इसे रीसेट कर सकते हैं, एक नया असाइन कर सकते हैं या एक इंडेक्स के रूप में एक कॉलम का उपयोग कर सकते हैं
एडचम

4
आपके पहले कोड उदाहरण में, df को अपेक्षित रूप से असाइन किया गया है, लेकिन यह रेखा: df.groupby ('a') count () एक खाली डेटाफ़्रेम देता है। क्या यह संभव है कि यह उत्तर 0.18.1 पंडों से पुराना हो? साथ ही, यह थोड़ा भ्रमित करने वाला है कि आपका कॉलम नाम 'a' वही है जो आप 'a' के लिए खोज रहे हैं। मैं इसे स्वयं संपादित करूंगा लेकिन चूंकि कोड मेरे लिए काम नहीं करता है इसलिए मैं अपने संपादन के बारे में सुनिश्चित नहीं हो सकता।
एलेक्स

1
@ यदि आप सही हैं तो यह नवीनतम संस्करणों में ऐसा लगता है कि यह अब काम नहीं करता है, मेरे लिए एक बग जैसा लगता है जैसे मैं नहीं देखता कि क्यों
एडचम

1
के df.['a'].value_counts().reset_index()बजाय का उपयोग क्यों नहीं df.groupby('a')['a'].transform('count')?
अग्रानुक्रम

1
@ टैंडेम, वे अलग-अलग काम करते हैं, कॉलिंग value_countsएक आवृत्ति गिनती उत्पन्न करेगी, यदि आप परिणाम को अपने मूल df के खिलाफ एक नए कॉलम के रूप में वापस जोड़ना चाहते हैं तो आपको transformमेरे उत्तर में विस्तृत रूप में उपयोग करना होगा ।
एडुकम

93

यदि आप उन सभी स्तंभों पर लागू करना चाहते हैं जो आप उपयोग कर सकते हैं:

df.apply(pd.value_counts)

यह कॉलम में से प्रत्येक पर एक कॉलम आधारित एकत्रीकरण फ़ंक्शन (इस मामले में value_counts) पर लागू होगा।


10
यह सबसे सरल उत्तर है। यह सबसे ऊपर होना चाहिए।
जेफरी जोस

4
यह उत्तर बस है लेकिन (मेरा मानना ​​है) applyऑपरेशन उन लाभों का लाभ नहीं उठाता है जो स्तंभ के रूप में Numpy सरणियों को वेक्टर करता है। नतीजतन, प्रदर्शन बड़े डेटासेट पर एक मुद्दा हो सकता है।
कुआनब

58
df.category.value_counts()

कोड की यह छोटी छोटी रेखा आपको इच्छित आउटपुट देगी।

यदि आपके कॉलम के नाम में रिक्त स्थान हैं, तो आप उपयोग कर सकते हैं

df['category'].value_counts()

2
या यदि स्तंभ नाम में जगह है तो [] का उपयोग करें । df['category 1'].value_counts()
जैकब कलाकल जोसेफ

19
df.apply(pd.value_counts).fillna(0)

value_counts - अद्वितीय मानों की संख्या वाले ऑब्जेक्ट लौटाता है

लागू करें - हर कॉलम में आवृत्ति की गणना करें। यदि आप सेट करते हैं axis=1, तो आपको प्रत्येक पंक्ति में आवृत्ति मिलती है

फिलना (0) - आउटपुट को अधिक फैंसी बनाते हैं। परिवर्तित NaN ०


1
यह बहुत शक्तिशाली होता है जब एक ही पंक्ति के लिए स्तंभों पर एक मान की घटनाओं की गणना करता है !!
amc

14

0.18.1 में groupbyसाथ मिलकर countअद्वितीय मानों की आवृत्ति नहीं देता है:

>>> df
   a
0  a
1  b
2  s
3  s
4  b
5  a
6  b

>>> df.groupby('a').count()
Empty DataFrame
Columns: []
Index: [a, b, s]

हालांकि, अद्वितीय मूल्यों और उनकी आवृत्तियों को आसानी से निर्धारित किया जाता है size:

>>> df.groupby('a').size()
a
a    2
b    3
s    2

df.a.value_counts()सॉर्ट किए गए मानों के साथ (अवरोही क्रम में, यानी पहले सबसे बड़ा मूल्य) डिफ़ॉल्ट रूप से वापस आ जाता है।



5

यदि आपके DataFrame में एक ही प्रकार के मान हैं, तो आप numpy.unique ()return_counts=True में भी सेट कर सकते हैं ।

index, counts = np.unique(df.values,return_counts=True)

यदि आपके मान पूर्णांक हैं, तो np.bincount () तेज हो सकता है।


4

बिना किसी पुस्तकालय के, आप इसके बजाय ऐसा कर सकते हैं:

def to_frequency_table(data):
    frequencytable = {}
    for key in data:
        if key in frequencytable:
            frequencytable[key] += 1
        else:
            frequencytable[key] = 1
    return frequencytable

उदाहरण:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}

1

तुम भी रूप में श्रेणियों पहले, जैसे अपने कॉलम प्रसारण द्वारा पांडा के साथ ऐसा कर सकते हैं dtype="category"जैसे

cats = ['client', 'hotel', 'currency', 'ota', 'user_country']

df[cats] = df[cats].astype('category')

और फिर कॉलिंग describe:

df[cats].describe()

इससे आपको वैल्यू काउंट की एक अच्छी तालिका मिलेगी और थोड़ा और :):

    client  hotel   currency    ota user_country
count   852845  852845  852845  852845  852845
unique  2554    17477   132 14  219
top 2198    13202   USD Hades   US
freq    102562  8847    516500  242734  340992

0
n_values = data.income.value_counts()

पहली अनूठी मूल्य गणना

n_at_most_50k = n_values[0]

दूसरा विशिष्ट मूल्य गणना

n_greater_50k = n_values[1]

n_values

आउटपुट:

<=50K    34014
>50K     11208

Name: income, dtype: int64

आउटपुट:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster पहले ही इस ओर इशारा कर चुका है। के लिए जाओ Counter। यह तेजी से धधक रहा है।

import pandas as pd
from collections import Counter
import timeit
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])

टाइमर

%timeit -n 10000 df['NumA'].value_counts()
# 10000 loops, best of 3: 715 µs per loop

%timeit -n 10000 df['NumA'].value_counts().to_dict()
# 10000 loops, best of 3: 796 µs per loop

%timeit -n 10000 Counter(df['NumA'])
# 10000 loops, best of 3: 74 µs per loop

%timeit -n 10000 df.groupby(['NumA']).count()
# 10000 loops, best of 3: 1.29 ms per loop

चीयर्स!




0

मेरा मानना ​​है कि यह किसी भी DataFrame कॉलम सूची के लिए ठीक काम करना चाहिए।

def column_list(x):
    column_list_df = []
    for col_name in x.columns:
        y = col_name, len(x[col_name].unique())
        column_list_df.append(y)
return pd.DataFrame(column_list_df)

column_list_df.rename(columns={0: "Feature", 1: "Value_count"})

फ़ंक्शन "column_list" कॉलम नामों की जाँच करता है और फिर प्रत्येक स्तंभ मानों की विशिष्टता की जाँच करता है।


आप एक संक्षिप्त विवरण जोड़ सकते हैं कि आपका कोड आपके उत्तर को बेहतर बनाने के लिए कैसे काम करता है।
दोब्रोमिर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.