Numpy 和lambda函数在pandas groupby中的应用
在pandas中,经常需要对数据进行聚合操作,groupby操作可以实现将数据按照某些条件分组,然后对分组后的数据进行聚合操作。numpy和lambda函数则可以在这个过程中实现更多的聚合操作。本文将介绍numpy和lambda函数在pandas groupby中的应用。
阅读更多:Numpy 教程
pandas Groupby
pandas的groupby操作可以将数据按照指定的列分组,然后可以对每一个分组进行一些操作,比如汇总(summarize)、转换(transform)和过滤(filter)等。groupby操作返回一个DataFrameGroupBy对象,可以通过调用聚合函数进行数据汇总。
例如,假如我们有如下的数据集:
import pandas as pd
df = pd.DataFrame({'Gender': ['M', 'M', 'M', 'F', 'F', 'F'],
'Height': [170, 180, 175, 160, 165, 170],
'Weight': [70, 80, 75, 55, 60, 65]})
print(df)
Gender Height Weight
0 M 170 70
1 M 180 80
2 M 175 75
3 F 160 55
4 F 165 60
5 F 170 65
我们可以通过Gender列进行分组,并计算每组的平均身高和体重,代码如下:
grouped = df.groupby('Gender')
result = grouped.mean()
print(result)
Height Weight
Gender
F 165.000000 60.000000
M 175.000000 75.000000
numpy聚合函数
numpy是科学计算中一个非常常用的库,其中包含很多的数学函数和聚合函数。在pandas中,我们可以使用numpy的聚合函数对groupby的结果进行聚合操作。
常用的聚合函数
在pandas中,常用的numpy聚合函数有:sum、mean、median、max、min、count、var、std等。这些聚合函数可以通过在DataFrameGroupBy对象上调用相应的函数来实现。下面我们以mean函数为例,计算上述示例数据集中每个Gender类别的身高均值和体重均值:
import numpy as np
result = grouped.mean()
print(result)
Height Weight
Gender
F 165.000000 60.000000
M 175.000000 75.000000
自定义聚合函数
如果我们需要实现除了常规的聚合函数之外的操作,比如针对一列数据进行自定义的聚合操作,就可以使用numpy的apply函数。
我们可以定义一个自定义的聚合函数来实现我们需要的操作。例如,假如我们需要计算每个Gender类别的身高和体重的偏差,代码如下:
def deviation(x):
return np.mean(np.abs(x - np.mean(x)))
dev = grouped.apply(lambda x: pd.Series({'Height_deviation': deviation(x['Height']),
'Weight_deviation': deviation(x['Weight'])}))
print(dev)
Height_deviation Weight_deviation
Gender
F 3.055050 3.055050
M 3.333333 3.333333
lambda函数
在pandas groupby中,我们可以使用lambda函数来进行自定义的数据转换和聚合操作。lambda函数可以直接传入apply()函数,用于对每个分组的数据进行处理。
对分组数据进行自定义转换
我们可以使用lambda函数对每个分组的数据进行自定义转换。例如,我们需要将身高和体重转换为BMI值,可以使用lambda函数将身高和体重进行计算,返回一个新的DataFrame。
bmi_grouped = df.groupby('Gender').apply(lambda x: pd.DataFrame({'BMI': x['Weight'] / ((x['Height'] / 100) ** 2)}))
print(bmi_grouped)
BMI
Gender
F 3 20.20202
4 22.03857
5 22.49135
M 0 24.22145
1 24.69136
2 24.48980
对分组数据进行自定义聚合
我们也可以使用lambda函数对分组后的数据进行自定义聚合。例如,我们需要计算身高和体重的极差(即最大值和最小值的差),代码如下:
range_grouped = df.groupby('Gender').apply(lambda x: pd.Series({'Height_range': np.max(x['Height']) - np.min(x['Height']),
'Weight_range': np.max(x['Weight']) - np.min(x['Weight'])}))
print(range_grouped)
Height_range Weight_range
Gender
F 10 5
M 10 10
总结
在pandas中,使用numpy聚合函数和lambda函数可以实现更多的聚合操作,使得数据分析更加灵活和高效。如果您有需要进行自定义的聚合操作,可以尝试使用numpy聚合函数和lambda函数来实现。