นับความถี่ที่ค่าเกิดขึ้นในคอลัมน์ dataframe


313

ฉันมีชุดข้อมูล

|category|
cat a
cat b
cat a

ฉันต้องการคืนบางสิ่งเช่น (แสดงค่าและความถี่ที่ไม่ซ้ำกัน)

category | freq |
cat a       2
cat b       1


94
คุณกำลังมองหาdf["category"].value_counts()อะไร?
DSM

เมื่อใช้ "df [" หมวดหมู่ "]. value_counts ()" มันระบุว่าเป็น int หรือไม่? แต่จะส่งกลับชื่อคอลัมน์เป็นดัชนี? มันเป็นวัตถุ dataframe หรือมันรวมชุด (จำนวน) และค่าคอลัมน์ที่ไม่ซ้ำเดิม?
yoshiserry

@yoshiserry เป็นซีรี่ส์ของ Pandas type(df['category'].value_counts())และจะพูดอย่างนั้น
EdChum

ฉันทำและฉันรู้สึกประหลาดใจกับสิ่งนั้น แต่มันก็สมเหตุสมผลดีที่ฉันคิดถึงมันมากขึ้น หลังจากทำสิ่งนี้แล้วค่าจะขึ้นอยู่กับบาง colums มีแถวที่ฉันต้องการยกเว้น ฉันรู้วิธีลบคอลัมน์ แต่ฉันจะยกเว้นแถวได้อย่างไร
yoshiserry

คำตอบ:


414

ใช้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 มีความเห็นหลายวิธีที่จะผิว cat ที่นี่

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 ไม่สิ่งที่คุณเห็นคือมันสร้างชุดข้อมูลที่สอดคล้องกับ dataframe ดั้งเดิมซึ่งแตกต่างจากวิธีอื่นที่แสดงค่าที่ไม่ซ้ำกันและความถี่ของพวกเขาหากคุณต้องการเพิ่มจำนวนความถี่กลับไปที่ dataframe คุณสามารถใช้การแปลงสำหรับ นี้. เป็นอีกเทคนิคหนึ่งที่คุณสังเกตเห็นว่ามันไม่ได้ยุบลง dataframe หลังจากกำหนดกลับมาและไม่มีค่าที่ขาดหายไป นอกจากนี้ฉันคิดว่า Dataframes มักจะมีดัชนีฉันไม่คิดว่าคุณสามารถกำจัดมันได้เพียงรีเซ็ตมันกำหนดใหม่หรือใช้คอลัมน์เป็นดัชนี
EdChum

4
ในตัวอย่างรหัสแรกของคุณ df ได้รับการมอบหมายตามที่คาดไว้ แต่บรรทัดนี้: df.groupby ('a'). count () ส่งคืน dataframe ที่ว่างเปล่า เป็นไปได้ไหมว่าคำตอบนี้ล้าสมัยเมื่อใช้แพนด้า 0.18.1? นอกจากนี้ยังมีความสับสนเล็กน้อยที่ชื่อคอลัมน์ของคุณ 'a' นั้นเหมือนกับค่าที่คุณกำลังค้นหา 'a' ฉันจะแก้ไขด้วยตัวเอง แต่เนื่องจากรหัสไม่ทำงานสำหรับฉันฉันจึงไม่แน่ใจในการแก้ไขของฉัน
อเล็กซ์

1
@ Alex คุณถูกต้องที่ดูเหมือนว่าในรุ่นล่าสุดนี้ไม่ได้ผลอีกต่อไปแล้วดูเหมือนว่าข้อผิดพลาดให้ฉันเป็นฉันไม่เห็นว่าทำไมไม่ได้
EdChum

1
ทำไมไม่ใช้df.['a'].value_counts().reset_index()แทนdf.groupby('a')['a'].transform('count')?
ตีคู่

1
@tandem พวกเขาทำสิ่งต่าง ๆ การโทรvalue_countsจะสร้างจำนวนความถี่ถ้าคุณต้องการเพิ่มผลลัพธ์กลับเป็นคอลัมน์ใหม่เทียบกับ df ดั้งเดิมของคุณคุณต้องใช้transformรายละเอียดในคำตอบของฉัน
EdChum

93

หากคุณต้องการใช้กับคอลัมน์ทั้งหมดคุณสามารถใช้:

df.apply(pd.value_counts)

สิ่งนี้จะนำไปใช้กับฟังก์ชันการรวมคอลัมน์ (ในกรณีนี้คือ value_counts) กับแต่ละคอลัมน์


10
นี่คือคำตอบที่ง่ายที่สุด สิ่งนี้ควรอยู่ด้านบนสุด
Jeffrey Jose

4
คำตอบนี้เป็นเพียง แต่ (ฉันเชื่อว่า) การapplyดำเนินการไม่ใช้ประโยชน์จากประโยชน์ที่ vectorized อาร์เรย์ Numpy เป็นคอลัมน์ให้ เป็นผลให้ประสิทธิภาพอาจมีปัญหากับชุดข้อมูลขนาดใหญ่
kuanb

58
df.category.value_counts()

บรรทัดเล็ก ๆ ของรหัสสั้น ๆ นี้จะให้ผลลัพธ์ที่คุณต้องการ

หากชื่อคอลัมน์ของคุณมีช่องว่างคุณสามารถใช้

df['category'].value_counts()

2
หรือใช้[]ถ้าชื่อคอลัมน์มีช่องว่าง df['category 1'].value_counts()
Jacob Kalakal Joseph

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

value_counts - ส่งคืนวัตถุที่มีการนับค่าที่ไม่ซ้ำกัน

ใช้ - นับความถี่ในทุกคอลัมน์ หากคุณตั้งค่าaxis=1คุณจะได้รับความถี่ในทุกแถว

fillna (0) - ทำให้เอาท์พุตแฟนซีมากขึ้น เปลี่ยน NaN เป็น 0


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 ของคุณมีค่าชนิดเดียวกันคุณยังสามารถตั้งค่าreturn_counts=Trueในnumpy.unique ()

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" ตรวจสอบชื่อคอลัมน์จากนั้นตรวจสอบความไม่ซ้ำกันของค่าคอลัมน์แต่ละค่า


คุณสามารถเพิ่มคำอธิบายสั้น ๆ ว่ารหัสของคุณทำงานอย่างไรเพื่อปรับปรุงคำตอบของคุณ
DobromirM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.