如何在Pandas中获取每组按字母排序后的首个值?
分组获取字母顺序首个值的解决方案
问题背景
现有DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'A': ['foo', 'foo', 'bar', 'bar', 'bar'], 'B': ['A', 'C', 'F', 'B', 'D'] })
需求是对A列的每组,获取B列按字母顺序排列后的首个值,并将该值填充到组内所有行的B列。
尝试使用以下代码:
df['B'] = df.groupby('A')['B'].transform('first')
得到的结果不符合预期:
A B 0 foo A 1 foo A 2 bar F 3 bar F 4 bar F
期望结果为:
A B 0 foo A 1 foo A 2 bar B 3 bar B 4 bar B
原因分析
groupby.transform('first')取的是每组在原DataFrame中出现的第一个值,而非排序后的首个值。比如bar组原数据中B列第一个值是F,所以得到的结果不是字母顺序最小的B。
解决方法
方法1:使用min函数(最简洁)
字符串的min()会返回字典序最小的值,刚好对应字母顺序的首个值,直接通过分组transform调用即可:
df['B'] = df.groupby('A')['B'].transform('min')
方法2:先排序再分组取首值
先按A列分组、B列排序,再提取每组的首个值,最后映射回原DataFrame:
# 先按A和B排序,确保每组内B列按字母顺序排列 sorted_df = df.sort_values(by=['A', 'B']) # 提取每组的首个B值 group_first = sorted_df.groupby('A')['B'].first() # 将值映射回原DataFrame df['B'] = df['A'].map(group_first)
方法3:lambda自定义排序取首
通过lambda函数对每组的B列排序后取第一个元素:
df['B'] = df.groupby('A')['B'].transform(lambda x: x.sort_values().iloc[0])
以上三种方法都能得到符合预期的结果,其中方法1最为简洁高效。
内容的提问来源于stack exchange,提问作者TYWu
相关产品推荐
相关产品推荐

