📅  最后修改于: 2023-12-03 14:53:05.968000             🧑  作者: Mango
在 Pandas 中,groupby 对象是一个强大的工具,允许我们按照指定的列对数据进行分组并进行聚合操作。groupby 对象本质上是一个字典,其中键为分组的类别,值为具有相同类别的数据行。
在本文中,我们将了解如何打印 groupby 对象以便更好地理解其结构和内容。
首先,让我们创建一个示例 DataFrame,其中包含一些学生的成绩和学科:
import pandas as pd
data = [['Alice', 'Math', 90],
['Alice', 'Science', 85],
['Bob', 'Math', 80],
['Bob', 'Science', 75],
['Charlie', 'Math', 95],
['Charlie', 'Science', 80]]
df = pd.DataFrame(data, columns=['Name', 'Subject', 'Score'])
现在,我们可以根据姓名对 DataFrame 进行分组,并计算每个学生的平均成绩:
grouped = df.groupby('Name')
average_scores = grouped.mean()
print(average_scores)
输出为:
Score
Name
Alice 87.5
Bob 77.5
Charlie 87.5
此时,我们得到了一个 groupby 对象,其中包含按姓名分组后的数据。为了打印 groupby 对象并查看其内容,我们可以使用 .groups
属性:
print(grouped.groups)
输出为:
{'Alice': [0, 1], 'Bob': [2, 3], 'Charlie': [4, 5]}
这个输出告诉我们每个姓名分组包含哪些原始数据行。更具体地说,Alice 组包含第 0 和第 1 行,Bob 组包含第 2 和第 3 行,Charlie 组包含第 4 和第 5 行。
我们还可以使用 .get_group()
方法访问单个分组。例如,要访问 Alice 组的数据,可以执行以下操作:
alice_group = grouped.get_group('Alice')
print(alice_group)
输出为:
Name Subject Score
0 Alice Math 90
1 Alice Science 85
这个输出告诉我们 Alice 组包含两行原始数据,其中一行包含数学成绩,另一行包含科学成绩。
在 Pandas 中,我们还可以使用 .apply()
方法对每个分组执行自定义函数。例如,以下示例定义了一个函数 passing_rate()
,该函数返回每个学生及其及格率:
def passing_rate(df):
name = df['Name'].iloc[0]
subject_count = len(df)
pass_count = len(df[df['Score'] >= 60])
rate = pass_count / subject_count
return pd.Series({'Name': name, 'Passing Rate': rate})
passing_rates = grouped.apply(passing_rate)
print(passing_rates)
输出为:
Name Passing Rate
Name
Alice Alice 1.0
Bob Bob 0.5
Charlie Charlie 1.0
这个输出告诉我们每个学生及其及格率。
在本文中,我们介绍了如何打印 groupby 对象以理解其结构和内容。通过使用 .groups
属性和 .get_group()
方法,我们可以查看分组对象的内部组织和单个分组的行。此外,我们还了解了如何使用 .apply()
方法执行自定义操作并创建新的 DataFrame。