Pandas中没有聚合的Groupby
Pandas是一个伟大的Python包,用于处理数据,我们作为初学者学习的一些工具是pandas的聚合和分组功能。
Groupby() 是一个用于根据给定条件将数据框架中的数据分成组的函数。另一方面,聚合对系列、数据进行操作,并返回数据的数字摘要。有很多聚合函数,如count(),max(),min(),mean(),std(),descri()。我们可以将这两个函数结合起来,在一个特定的列上找到多个聚合函数。关于这一点的进一步细节,请参考这篇文章:如何在Pandas中结合Groupby和多重聚合函数。
与其一起使用groupby聚合,我们可以执行groupby而不聚合,这适用于单独聚合数据。我们将用一个例子来说明这一点,我们将采取一个乳腺癌数据集,其中有不同的数字特征,如平均面积,最差的纹理,等等。目标列有0,表示癌症是良性的,1表示癌症是恶性的。
示例 1:
# importing python libraries and breast_cancer dataset from sklearn
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.datasets import load_breast_cancer
# data is loaded in a DataFrame
cancer_data = load_breast_cancer()
df = pd.DataFrame(cancer_data.data, columns=cancer_data.feature_names)
df['target'] = pd.Series(cancer_data.target)
df.head()
输出:
因此,我们可以将所有列的数据可视化,但所有列都是数字形式的,没有分类数据,而只有目标列,所以让我们看看目标和另一个名为_’最差纹理’的列。
print(df['target'].describe(), df['worst texture'].describe())
输出:
count 569.000000
mean 0.627417
std 0.483918
min 0.000000
25% 0.000000
50% 1.000000
75% 1.000000
max 1.000000
Name: target, dtype: float64
count 569.000000
mean 25.677223
std 6.146258
min 12.020000
25% 21.080000
50% 25.410000
75% 29.720000
max 49.540000
Name: worst texture, dtype: float64
这里我们可以看到target和worst texture这两列的汇总,我们只取这几列来更好地理解groupby聚合函数。
df1 = df[['worst texture', 'worst area', 'target']]
gr1 = df1.groupby(df1['target']).mean()
gr1
输出:
因此,在这里我们看到了围绕良性和恶性癌症分组的最差纹理和最差面积的平均值,现在正常数据已经被这个方法干扰了,我们必须把它们分开添加,这就是为什么没有聚集的groupby变得很方便。
# function to take the data as group and perform aggregation
def meanofTargets(group1):
wt = group1['worst texture'].agg('mean')
wa = group1['worst area'].agg('mean')
group1['Mean worst texture'] = wt
group1['Mean worst area'] = wa
return group1
df2 = df1.groupby('target').apply(meanofTargets)
df2
输出:
因此,在上述数据集中,我们能够将最差面积和最差纹理的平均值加入到一个单独的列中,我们用目标列的groupby方法来做,它将’1’和’0’分别分组。
示例 2:
同样地,让我们看看另一个使用groupby而不进行聚合的例子。但是由于没有分类列,我们必须自己制作一个分类列。为此,让我们选择平均面积,它的最大值为2500,最小值为150,所以我们将使用pandas cut方法将它们分为6组,范围为400。由于这与文章的主题无关,更多信息请参考GitHub repo。
因此,我们做了一个分类列 “Cat_mean_area”,我们也可以在这里执行groupby聚合方法。但是我们可以不对整个数据集进行分组,而只使用一些特定的列,比如平均面积和目标。
# dataframe df_3 to contain only mean_area,Cat_mean_area and target
df_3 = df_2[['mean area', 'Cat_mean_area', 'target']]
# applying groupby sum
gr2 = df_3.groupby(df_2['Cat_mean_area']).sum()
gr2
输出:
因此,通过上述步骤,我们进行groupby而不进行聚合。
# function to take the data as group and perform aggregation
def totalTargets(group):
g = group['target'].agg('sum')
group['Total_targets'] = g
return group
df_4 = df_3.groupby(df_3['Cat_mean_area']).apply(totalTargets)
df_4
输出: