Pandas DataFrame中groupby的by参数函数所指“对象索引的每个值”是什么?
Pandas groupby by参数传函数的疑问解答
1. 「对象索引的每个值」具体指什么?
这里的「对象索引的每个值」,指的是你要分组的DataFrame/Series索引中的单个元素:
- 如果是普通单级索引(比如整数、字符串序列),就是索引里的每一个独立值,比如
[10,20,30]里的10、20、30; - 如果是多层索引(MultiIndex),则是每一组完整的索引元组,比如
[('x',1), ('x',2)]里的('x',1)、('x',2)。
举个简单示例:
import pandas as pd # 普通索引的DataFrame df = pd.DataFrame({'value': [1,2,3,4]}, index=[10,20,30,40]) # 定义提取索引首数字的函数 def get_index_first_digit(idx_val): return str(idx_val)[0] # 按函数分组 grouped = df.groupby(by=get_index_first_digit)
这个场景下,get_index_first_digit会被依次传入索引的每个值:10、20、30、40,分别返回'1'、'2'、'3'、'4',最终DataFrame会按这个返回值分成4组。
2. 该函数是否会接收每行各列的所有值?
不会。这个函数只接收索引的单个值作为唯一参数,完全不会接触到行内的其他列数据。如果你的分组逻辑需要用到行的列值,应该直接针对列做处理(比如用df.groupby(lambda x: df['col'].iloc[x])或者直接指定列名分组),而不是把函数传给by参数(这种方式仅作用于索引)。
再给一个多层索引的示例:
# 多层索引的DataFrame df_multi = pd.DataFrame({'value': [1,2,3]}, index=[('A', 1), ('A', 2), ('B', 1)]) # 按多层索引的第一层级分组 def group_by_first_level(idx_tuple): return idx_tuple[0] grouped_multi = df_multi.groupby(by=group_by_first_level)
这里函数接收的是每个完整的索引元组('A',1)、('A',2)、('B',1),返回元组的第一个元素,最终会按'A'和'B'分成两组。
内容的提问来源于stack exchange,提问作者Dims
相关产品推荐
相关产品推荐

