You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:52:35