Pandas中没有聚合的Groupby

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()

输出:

Pandas中没有聚合的Groupby

因此,我们可以将所有列的数据可视化,但所有列都是数字形式的,没有分类数据,而只有目标列,所以让我们看看目标和另一个名为_’最差纹理’的列。

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

这里我们可以看到targetworst texture这两列的汇总,我们只取这几列来更好地理解groupby聚合函数。

df1 = df[['worst texture', 'worst area', 'target']]
gr1 = df1.groupby(df1['target']).mean()
gr1

输出:

Pandas中没有聚合的Groupby

因此,在这里我们看到了围绕良性和恶性癌症分组的最差纹理和最差面积的平均值,现在正常数据已经被这个方法干扰了,我们必须把它们分开添加,这就是为什么没有聚集的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

输出:

Pandas中没有聚合的Groupby

因此,在上述数据集中,我们能够将最差面积和最差纹理的平均值加入到一个单独的列中,我们用目标列的groupby方法来做,它将’1’和’0’分别分组。

示例 2:

同样地,让我们看看另一个使用groupby而不进行聚合的例子。但是由于没有分类列,我们必须自己制作一个分类列。为此,让我们选择平均面积,它的最大值为2500,最小值为150,所以我们将使用pandas cut方法将它们分为6组,范围为400。由于这与文章的主题无关,更多信息请参考GitHub repo。

Pandas中没有聚合的Groupby

因此,我们做了一个分类列 “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

输出:

Pandas中没有聚合的Groupby

因此,通过上述步骤,我们进行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

输出:

Pandas中没有聚合的Groupby

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程