एक एकल चर के लिए आवृत्ति तालिका


97

दिन के लिए एक आखिरी नौसिखिया पांडा प्रश्न: मैं एक श्रृंखला के लिए एक तालिका कैसे उत्पन्न करूं?

उदाहरण के लिए:

my_series = pandas.Series([1,2,2,3,3,3])
pandas.magical_frequency_function( my_series )

>> {
     1 : 1,
     2 : 2, 
     3 : 3
   }

बहुत सारे गोग्लिंग ने मुझे Series.describe () और pandas.crosstabs की ओर अग्रसर किया है, लेकिन इनमें से किसी को भी मेरी ज़रूरत नहीं है: एक चर, श्रेणियों द्वारा गिना जाता है। ओह, और यह अच्छा होगा यदि यह विभिन्न डेटा प्रकारों के लिए काम करता है: स्ट्रिंग्स, इनट्स, आदि।

जवाबों:


153

हो सकता है .value_counts()?

>>> import pandas
>>> my_series = pandas.Series([1,2,2,3,3,3, "fred", 1.8, 1.8])
>>> my_series
0       1
1       2
2       2
3       3
4       3
5       3
6    fred
7     1.8
8     1.8
>>> counts = my_series.value_counts()
>>> counts
3       3
2       2
1.8     2
fred    1
1       1
>>> len(counts)
5
>>> sum(counts)
9
>>> counts["fred"]
1
>>> dict(counts)
{1.8: 2, 2: 2, 3: 3, 1: 1, 'fred': 1}

5
.value_counts().sort_index(1), पहले स्तंभ को रोकने के लिए संभवत: थोड़ा बाहर का क्रम मिल रहा है
smci

9
क्या सीरीज के बजाय डेटाफ्रेम के लिए एक समान है? मैंने एक df पर .value_counts () चलाने की कोशिश की और मिल गयाAttributeError: 'DataFrame' object has no attribute 'value_counts'
Mittenchops 14

1
क्या इन गणनाओं को अनुपात में बदलने का एक आसान तरीका है?
dsaxton

7
@dsaxton आप परिणाम के परिणाम में परिवर्तित करने के लिए .value_counts (normalize = True) का उपयोग कर सकते हैं
मैक्स पावर

2
इसके बजाय एक डेटाफ्रेम पर इसका उपयोग करने के लिए, यह समतुल्य 1-डी के बराबर सरणी प्रतिनिधित्व में परिवर्तित करता है, जैसे - pd.value_counts(df.values.ravel())जो एक श्रृंखला लौटाता है जिसके गुण indexऔर valuesगुण क्रमशः अद्वितीय तत्व और उनके मायने रखते हैं।
निकिल मावेली

11

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

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]

टूट - फूट:

my_series.select_dtypes(include=['O']) 

केवल श्रेणीबद्ध डेटा का चयन करता है

list(my_series.select_dtypes(include=['O']).columns) 

ऊपर से स्तंभों को सूची में बदल देता है

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)] 

ऊपर दी गई सूची के माध्यम से Iterates और प्रत्येक कॉलम में value_counts () लागू करता है


5

@DSM द्वारा प्रदान किया गया उत्तर सरल और सीधा है, लेकिन मुझे लगा कि मैं इस प्रश्न पर अपना स्वयं का इनपुट जोड़ूंगा। यदि आप pandas.value_counts के कोड को देखते हैं , तो आप देखेंगे कि बहुत कुछ चल रहा है।

यदि आपको कई श्रृंखलाओं की आवृत्ति की गणना करने की आवश्यकता है, तो इसमें कुछ समय लग सकता है। एक तेजी से कार्यान्वयन के साथ numpy.unique का उपयोग करना होगाreturn_counts = True

यहाँ एक उदाहरण है:

import pandas as pd
import numpy as np

my_series = pd.Series([1,2,2,3,3,3])

print(my_series.value_counts())
3    3
2    2
1    1
dtype: int64

यहां ध्यान दें कि आइटम वापस किया गया एक पांडा है

इसकी तुलना में, numpy.uniqueदो वस्तुओं, अद्वितीय मूल्यों और मायने रखता है के साथ एक tuple देता है।

vals, counts = np.unique(my_series, return_counts=True)
print(vals, counts)
[1 2 3] [1 2 3]

फिर आप इन्हें एक शब्दकोश में जोड़ सकते हैं:

results = dict(zip(vals, counts))
print(results)
{1: 1, 2: 2, 3: 3}

और फिर ए में pandas.Series

print(pd.Series(results))
1    1
2    2
3    3
dtype: int64

0

अत्यधिक मूल्यों के साथ एक चर के आवृत्ति वितरण के लिए आप कक्षाओं में मूल्यों को नीचे गिरा सकते हैं,

यहाँ मैं employrateचर के लिए अत्यधिक मान है , और इसका प्रत्यक्ष अर्थ के साथ आवृत्ति वितरण का कोई अर्थ नहीं हैvalues_count(normalize=True)

                country  employrate alcconsumption
0           Afghanistan   55.700001            .03
1               Albania   11.000000           7.29
2               Algeria   11.000000            .69
3               Andorra         nan          10.17
4                Angola   75.699997           5.57
..                  ...         ...            ...
208             Vietnam   71.000000           3.91
209  West Bank and Gaza   32.000000               
210         Yemen, Rep.   39.000000             .2
211              Zambia   61.000000           3.56
212            Zimbabwe   66.800003           4.96

[213 rows x 3 columns]

values_count(normalize=True)बिना वर्गीकरण के साथ आवृत्ति वितरण , परिणाम की लंबाई 139 है (आवृत्ति वितरण के रूप में अर्थहीन लगता है):

print(gm["employrate"].value_counts(sort=False,normalize=True))

50.500000   0.005618
61.500000   0.016854
46.000000   0.011236
64.500000   0.005618
63.500000   0.005618

58.599998   0.005618
63.799999   0.011236
63.200001   0.005618
65.599998   0.005618
68.300003   0.005618
Name: employrate, Length: 139, dtype: float64

वर्गीकरण डालते हुए हम सभी मूल्यों को एक निश्चित सीमा के साथ रखते हैं।

1 के रूप में 0-10,
2 के रूप में 11-20  
21-30 3 के रूप में, और इसके बाद।
gm["employrate"]=gm["employrate"].str.strip().dropna()  
gm["employrate"]=pd.to_numeric(gm["employrate"])
gm['employrate'] = np.where(
   (gm['employrate'] <=10) & (gm['employrate'] > 0) , 1, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=20) & (gm['employrate'] > 10) , 1, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=30) & (gm['employrate'] > 20) , 2, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=40) & (gm['employrate'] > 30) , 3, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=50) & (gm['employrate'] > 40) , 4, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=60) & (gm['employrate'] > 50) , 5, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=70) & (gm['employrate'] > 60) , 6, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=80) & (gm['employrate'] > 70) , 7, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=90) & (gm['employrate'] > 80) , 8, gm['employrate']
   )
gm['employrate'] = np.where(
   (gm['employrate'] <=100) & (gm['employrate'] > 90) , 9, gm['employrate']
   )
print(gm["employrate"].value_counts(sort=False,normalize=True))

वर्गीकरण के बाद हमारे पास एक स्पष्ट आवृत्ति वितरण है। यहां हम आसानी से देख सकते हैं, कि 37.64%देशों के बीच दर कार्यरत है 51-60% और 11.79%देशों के बीच दर नियोजित है71-80%

5.000000   0.376404
7.000000   0.117978
4.000000   0.179775
6.000000   0.264045
8.000000   0.033708
3.000000   0.028090
Name: employrate, dtype: float64
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.