Pandas中没有聚合的Groupby

  • Post category:Python

Pandas中的groupby方法可以对数据进行分组并应用各种聚合函数。但是,有时候我们想要对数据进行分组,但是不需要进行聚合操作。这就是Pandas中没有聚合的groupby操作,本文将为大家详细讲解这一操作的完整攻略。

筛选数据

首先,我们需要有一些数据来进行操作。下面我们以糖尿病数据集为例。我们可以使用如下代码读取数据:

import pandas as pd
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
df = pd.read_csv(url, names=names)

这会将数据读入一个名为df的DataFrame中。我们可以通过head()方法查看DataFrame的前几行数据:

df.head()

我们可以看到,这个数据集共有9个属性,包括怀孕次数(preg)、血浆葡萄糖浓度(plas)、舒张压(pres)、皮脂厚度(skin)、胰岛素浓度(test)、体重指数(mass)、糖尿病谱系功能(pedi)、年龄(age)和结果(class)。

我们可以使用groupby方法对数据集进行分组,以查看各组数据的情况。例如,我们可以按照结果(class)属性对数据集进行分组:

grouped = df.groupby('class')

这会将数据集按照结果(class)属性分成了两组。我们可以使用get_group方法访问各个分组,例如:

grouped.get_group(0).head()

这会访问结果(class)为0的分组。我们可以看到,这个分组中所有样本的结果(class)属性均为0。

迭代数据

除了访问分组数据,我们还可以迭代每个分组。例如,我们想要对两个分组的怀孕次数进行比较:

for name, group in grouped:
    print(name)
    print(group['preg'].describe())
    print('\n')

这个代码块会输出每个分组的结果(class)以及每个分组中怀孕次数(preg)属性的描述性统计信息。

批量处理分组数据

有时候我们想要对每个分组应用同一种函数。例如,我们想要将每个分组的每个属性的均值减去分组均值:

result = grouped.transform(lambda x: x - x.mean())
result.groupby(df['class']).mean()

这个代码块首先使用transform方法求出每个分组中每个属性的均值,然后将每个分组中的每个属性减去相应的均值。最后,代码块打印出了结果(class)为0和1的分组中所有属性的均值。

多个键分组

我们刚才对数据集进行分组时只使用了结果(class)属性。但是,我们也可以使用多个属性进行分组。例如,我们想要按照结果(class)和年龄(age)对数据集进行分组:

grouped = df.groupby(['class', 'age'])

这个代码块会将数据集按照结果(class)和年龄(age)两个属性进行分组,共产生42组。我们可以使用get_group方法、迭代数据和批量处理分组数据的方法来访问和处理这些分组数据。

总结

到此为止,我们已经介绍了Pandas中没有聚合的groupby操作的完整攻略。我们讨论了如何访问分组数据、迭代数据以及批量处理分组数据,并使用了实际数据进行了演示。我们还介绍了如何按照多个属性进行数据分组,以便更好地理解数据。