Data Analysis

Pandas DataFrame中高效统计值频数

Spread the love

Pandas是一个强大的Python数据分析库,一个常见任务是确定DataFrame中值的频率。本文探讨了三种高效的计数值频率的方法:value_counts()groupby().size()groupby().count()。我们将检查每种方法,突出它们的优缺点,并提供清晰的示例。

目录

Series.value_counts()方法

value_counts()方法是计算单个列(Series)中值频率最简单、最有效的方法。它返回一个Series,其中索引代表唯一值,值代表它们的计数,默认情况下按降序排序。当您需要特定列中各个值的频率时,这是理想的选择。


import pandas as pd

data = {'Category': ['A', 'A', 'B', 'B', 'A', 'C', 'A']}
df = pd.DataFrame(data)

category_counts = df['Category'].value_counts()
print(category_counts)

输出:


A    4
B    2
C    1
Name: Category, dtype: int64

df.groupby().size()方法

groupby().size()方法在对DataFrame分组后提供每个组的大小(行数)。与groupby().count()不同,它不受其他列中缺失值的影响;它只是计算每个组中的行数。这非常适合获得组出现次数的直接计数。


import pandas as pd

data = {'Category': ['A', 'A', 'B', 'B', 'A', 'C'],
        'Value': [1, 2, 1, 1, 2, 3]}
df = pd.DataFrame(data)

category_counts = df.groupby('Category').size()
print(category_counts)

输出:


Category
A    3
B    2
C    1
dtype: int64

df.groupby().count()方法

groupby().count()方法用途广泛,允许您跨多个列计算频率。它对DataFrame进行分组,然后计算每个组中*所有*列的非空值。这意味着缺失数据会影响计数。当您需要跨多个列进行计数时,可以使用此方法,但需要注意缺失数据可能带来的影响。


import pandas as pd

data = {'Category': ['A', 'A', 'B', 'B', 'A', 'C'],
        'Value': [1, 2, 1, 1, 2, 3],
        'Value2': [10, 20, 30, 40, 50, 60]}
df = pd.DataFrame(data)

# 统计所有列中'Category'的出现次数
category_counts = df.groupby('Category').count()
print(category_counts)

#关注单个列
category_counts_value = df.groupby('Category')['Value'].count()
print(category_counts_value)

输出:


         Value  Value2
Category                 
A            3       3
B            2       2
C            1       1

Category
A    3
B    2
C    1
Name: Value, dtype: int64

总而言之,最佳方法取决于您的具体需求。value_counts()最适合单列,groupby().size()最适合简单的组计数,groupby().count()最适合涉及多列的更复杂场景,但需要仔细处理缺失值。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注