如何基于Version列前缀分组DataFrame并提取指定字段值
按Version前缀分组并选取特定值的解决方案
原始数据
| Date | Version | Value | Name |
|---|---|---|---|
| Jan 1 | 123.1 | 3 | A |
| Jan 2 | 123.23 | 5 | A |
| Jan 1 | 223.1 | 6 | B |
| Jan 2 | 623.23 | 7 | B |
需求说明
按Version列小数点前的前缀分组:
- Value取分组内Version字符串长度最长的行的Value值
- Name取分组内任意一行的Name值
实现代码
import pandas as pd # 构建示例DataFrame df = pd.DataFrame({ 'Date': ['Jan 1', 'Jan 2', 'Jan 1', 'Jan 2'], 'Version': ['123.1', '123.23', '223.1', '623.23'], 'Value': [3, 5, 6, 7], 'Name': ['A', 'A', 'B', 'B'] }) # 提取Version前缀(小数点前部分) df['Version Prefix'] = df['Version'].str.split('.').str[0] # 计算每个Version的字符串长度 df['Version Length'] = df['Version'].str.len() # 按前缀分组,取Version长度最长的行(先降序排序,再取每组第一行) result = df.sort_values('Version Length', ascending=False)\ .groupby('Version Prefix')\ .first()\ .reset_index() # 保留需要的列 result = result[['Version Prefix', 'Value', 'Name']] print(result)
输出结果
| Version Prefix | Value | Name |
|---|---|---|
| 123 | 5 | A |
| 223 | 6 | B |
| 623 | 7 | B |
代码说明
- 提取前缀:通过
str.split('.').str[0]将Version字符串按小数点拆分,取第一部分作为分组依据。 - 计算长度:用
str.len()获取每个Version的字符串长度,用于筛选最长的条目。 - 分组筛选:先按Version长度降序排序,确保每组中最长的条目排在首位;再按前缀分组,用
first()获取每组的第一条数据,即对应最长Version的行。 - 整理结果:只保留需求指定的三列,得到最终输出。
内容的提问来源于stack exchange,提问作者n179911a
相关产品推荐
相关产品推荐

