“分-应用-合并”策略是数据分析中一种强大的模式。此过程的第一步是根据某些条件将数据分成组。Pandas 主要通过 groupby() 方法实现此目的。可以将 groupby() 理解为告诉 Pandas:“将此 DataFrame 的行分离到不同的‘桶’中,每个‘桶’包含在特定列(或多列)中具有相同值的行。”此操作不会立即改变 DataFrame 或显示已分离的数据。相反,它会创建一个特殊的中间对象,称为 GroupBy 对象。该对象包含所有必要的分组信息,并已准备好进行下一步:对每个组应用函数(例如计算总和或平均值)。groupby() 方法基本语法很简单:你在 DataFrame 上调用 groupby() 方法,并传入你希望作为分组依据的列名(或列名列表)。让我们用一个例子来说明。假设我们有一个小数据集,记录了不同产品在各个区域的销售情况。import pandas as pd # 示例销售数据 data = {'Region': ['North', 'South', 'North', 'South', 'East', 'East', 'North'], 'Product': ['A', 'A', 'B', 'B', 'A', 'B', 'A'], 'Sales': [100, 150, 200, 50, 120, 80, 90]} df = pd.DataFrame(data) print("原始 DataFrame:") print(df)Output:原始 DataFrame: Region Product Sales 0 North A 100 1 South A 150 2 North B 200 3 South B 50 4 East A 120 5 East B 80 6 North A 90现在,让我们按照‘Region’列对这个 DataFrame 进行分组:# 按照‘Region’列进行分组 grouped_by_region = df.groupby('Region') print("\ngroupby('Region') 的结果:") print(grouped_by_region)Output:groupby('Region') 的结果: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x...>注意,输出本身并不是分组后的数据。它是一个 DataFrameGroupBy 对象。这个对象实际上包含多个小型 DataFrame,‘Region’列中的每个唯一值(‘North’、‘South’、‘East’)对应一个。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, margin=0.2]; edge [arrowhead=vee, arrowsize=0.7]; subgraph cluster_df { label = "原始 DataFrame (df)"; bgcolor="#e9ecef"; df_node [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#ced4da"><B>区域</B></TD><TD BGCOLOR="#ced4da"><B>产品</B></TD><TD BGCOLOR="#ced4da"><B>销售额</B></TD></TR> <TR><TD>North</TD><TD>A</TD><TD>100</TD></TR> <TR><TD>South</TD><TD>A</TD><TD>150</TD></TR> <TR><TD>North</TD><TD>B</TD><TD>200</TD></TR> <TR><TD>South</TD><TD>B</TD><TD>50</TD></TR> <TR><TD>East</TD><TD>A</TD><TD>120</TD></TR> <TR><TD>East</TD><TD>B</TD><TD>80</TD></TR> <TR><TD>North</TD><TD>A</TD><TD>90</TD></TR> </TABLE>>, shape=plain]; } subgraph cluster_groupby { label = "df.groupby('Region')"; bgcolor="#a5d8ff"; groupby_obj [label="DataFrameGroupBy 对象\n(包含分组信息)", shape=ellipse, style=filled, fillcolor="#d0bfff"]; } subgraph cluster_groups { label = "组(GroupBy 对象内部)"; bgcolor="#b2f2bb"; node [style=filled]; group_north [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" BGCOLOR="#ffffff"> <TR><TD COLSPAN="3" BGCOLOR="#74c0fc"><B>组:North</B></TD></TR> <TR><TD>North</TD><TD>A</TD><TD>100</TD></TR> <TR><TD>North</TD><TD>B</TD><TD>200</TD></TR> <TR><TD>North</TD><TD>A</TD><TD>90</TD></TR> </TABLE>>, shape=plain, fillcolor="#ffffff"]; group_south [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" BGCOLOR="#ffffff"> <TR><TD COLSPAN="3" BGCOLOR="#74c0fc"><B>组:South</B></TD></TR> <TR><TD>South</TD><TD>A</TD><TD>150</TD></TR> <TR><TD>South</TD><TD>B</TD><TD>50</TD></TR> </TABLE>>, shape=plain, fillcolor="#ffffff"]; group_east [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" BGCOLOR="#ffffff"> <TR><TD COLSPAN="3" BGCOLOR="#74c0fc"><B>组:East</B></TD></TR> <TR><TD>East</TD><TD>A</TD><TD>120</TD></TR> <TR><TD>East</TD><TD>B</TD><TD>80</TD></TR> </TABLE>>, shape=plain, fillcolor="#ffffff"]; } df_node -> groupby_obj [label="groupby('Region')"]; groupby_obj -> group_north [style=dashed, arrowhead=none]; groupby_obj -> group_south [style=dashed, arrowhead=none]; groupby_obj -> group_east [style=dashed, arrowhead=none]; }将 groupby('Region') 应用到 DataFrame 的示意图。该方法创建一个 GroupBy 对象,其中包含原始 DataFrame 中每个唯一区域的子集引用。GroupBy 对象有何用途?这个 GroupBy 对象是分-应用-合并过程的根本。虽然它本身不直接显示太多,但已准备好进行“应用”步骤。你可以对其执行各种操作,例如:聚合: 为每个组独立计算汇总统计量(如平均值、总和、计数)。这是最常见的用法,将在下一节(“应用聚合函数”)中说明。转换: 执行组特定的计算,并返回与原始 DataFrame 形状一致的结果。筛选: 根据某些组级别计算丢弃整个组。迭代: 遍历各个组(我们将在后面的“迭代分组”中看到这一点)。目前,重要的要点是 df.groupby('column_name') 能根据指定列高效地分割 DataFrame,并创建一个 GroupBy 对象,为后续对每个组的分析打下基础。