您的位置:

Pandas分组统计

Pandas是一个强大的数据分析工具,可以用来处理大量的数据,包括分组,汇总和统计等。当面对大量的数据时,经常需要按照特定的标准对数据进行分组,然后对每个组进行统计分析,这时候就需要用到Pandas的分组统计功能。下面将会从多个方面对Pandas分组统计进行详细阐述。

一、分组

在对数据进行统计时,经常需要将数据进行分组,以便于进行更加精细的统计。在Pandas中,可以使用groupby()函数进行分组,它的基本语法是:

    df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

其中,参数by表示按照哪列或者哪些列进行分组,也可以是一个函数;axis表示运算轴向,默认为0表示行方向,1表示列方向;level表示按照哪个级别进行分组,多重索引时使用;as_index表示是否以分组列为索引;sort表示分组后是否对结果进行排序;group_keys表示是否总是返回分组键作为一级索引;squeeze表示是否对单层索引进行降维操作。

下面是一个通过年龄对数据进行分组的代码示例:

import pandas as pd

data = {
    'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Tom'],
    'Age': [28, 34, 29, 42, 23],
    'Country': ['US', 'UK', 'UK', 'US', 'US']}
df = pd.DataFrame(data)
print(df.groupby('Age').groups)

上述代码中,通过groupby()函数按照年龄对数据进行分组,结果打印出各个分组中的索引。

二、汇总

分组完成后,接下来就是汇总统计了。Pandas提供了多种汇总统计方法,包括计数、求和、均值、方差、标准差、最小值和最大值等。

下面是一些常见的汇总统计方法:

  • count(): 统计每个分组中非空值的数量
  • sum(): 统计每个分组中数值的总和
  • mean(): 统计每个分组中数值的平均值
  • median(): 统计每个分组中数值的中位数
  • std(): 统计每个分组中数值的标准差
  • var(): 统计每个分组中数值的方差
  • min(): 统计每个分组中数值的最小值
  • max(): 统计每个分组中数值的最大值

下面是一个对数据进行汇总统计的代码示例:

import pandas as pd

data = {
    'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Tom'],
    'Age': [28, 34, 29, 42, 23],
    'Country': ['US', 'UK', 'UK', 'US', 'US']}
df = pd.DataFrame(data)
print(df.groupby('Country')['Age'].agg(['count', 'sum', 'mean', 'std', 'min', 'max']))

上述代码中,按照国家进行分组,并统计各个分组中年龄的count、sum、mean、std、min和max等汇总统计信息。

三、过滤

在进行数据分析时,我们常常需要筛选出满足某些特定条件的数据,这时候就需要用到过滤功能。在Pandas中,可以使用filter()函数进行过滤,其基本语法是:

    df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs).filter(func, dropna=True)

其中,参数func表示用来进行筛选的函数,其返回值必须是True或False值;dropna表示是否删除含有缺失值的行,默认为True。

下面是一个对数据进行过滤的代码示例:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Tom'], 'Age': [28, 34, 29, 42, 23],
        'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shanghai', 'Beijing']}
df = pd.DataFrame(data)
df_filtered = df.groupby('City').filter(lambda x: len(x) >= 2)
print(df_filtered)

上述代码中,按照城市进行分组,然后使用filter()函数对分组后的数据进行过滤,选取城市出现次数大于等于2次的数据,最后打印输出筛选后的数据。

四、转换

数据转换是指在不改变数据结构的前提下,修改数据的值。在Pandas中,可以使用transform()函数进行转换,其基本语法是:

    df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs).transform(func, axis=0)

其中,参数func表示用来进行转换的函数;axis表示运算轴向,默认为0表示列方向,1表示行方向。

下面是一个对数据进行转换的代码示例:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Tom'], 'Age': [28, 34, 29, 42, 23],
        'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shanghai', 'Beijing']}
df = pd.DataFrame(data)
df['Age'] = df.groupby('City')['Age'].transform(lambda x: x.mean())
print(df)

上述代码中,按照城市进行分组,然后使用transform()函数对分组后的数据进行转换,将年龄列的值改为每个城市年龄的均值,最后打印输出转换后的数据。

五、应用

应用是指对分组后的数据进行操作,如删除某些行、替换某些值等。在Pandas中,可以使用apply()函数进行操作,其基本语法是:

    df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs).apply(func, *args, **kwargs)

其中,参数func表示进行操作的函数;*args和**kwargs分别表示传递给函数的位置参数和关键字参数。

下面是一个对数据进行应用的代码示例:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Tom'], 'Age': [28, 34, 29, 42, 23],
        'City': ['Beijing', 'Shanghai', 'Guangzhou', 'Shanghai', 'Beijing']}
df = pd.DataFrame(data)
df.groupby('City').apply(lambda x: x.sort_values(by='Age', ascending=False)[:2]).reset_index(drop=True)
print(df)

上述代码中,按照城市进行分组,然后使用apply()函数对分组后的数据进行操作,选出每个城市中年龄最大的两个人,并将结果进行合并。最后打印输出应用后的数据。

六、总结

本文对Pandas分组统计进行了详细的阐述,主要涉及到分组、汇总、过滤、转换和应用等不同方面。在实际应用中,可以根据具体需求采取不同的方法进行数据分析和处理。希望本文可以为读者提供一些参考和帮助。