如何基于字符串中的数值,使用groupby对Pandas DataFrame分组?
基于字符串中的数值对DataFrame分组的解决方案
方法1:正则提取分组键并分组
先从目标列中提取用于分组的整数部分,再进行分组操作:
import pandas as pd df = pd.DataFrame({'x':['ab_c_1.0','ab_c_1.1','ab_c_12.0','ab_c_12.1','ab_c_123.0','ab_c_123.1']}) # 提取最后下划线后小数点前的整数作为分组键 group_keys = df['x'].str.extract(r'_(\d+)\.\d+', expand=False) # 按提取的键分组 groups = df.groupby(group_keys) # 输出分组结果 for key, group in groups: print(f"分组 {key}:") print(group) print()
方法2:字符串分割获取分组键
无需正则,通过字符串分割也能实现:
# 先按下划线分割取最后一段,再按小数点分割取整数部分 group_keys = df['x'].str.split('_').str[-1].str.split('.').str[0] groups = df.groupby(group_keys) for key, group in groups: print(f"分组 {key}:") print(group) print()
直接在groupby中嵌入提取逻辑(无额外列)
如果不想生成中间列,可以直接把提取逻辑传入groupby:
groups = df.groupby(df['x'].str.extract(r'_(\d+)\.\d+', expand=False)) for key, group in groups: print(f"分组 {key}:") print(group) print()
运行后都会得到你期望的结果:
分组 1: x 0 ab_c_1.0 1 ab_c_1.1 分组 12: x 2 ab_c_12.0 3 ab_c_12.1 分组 123: x 4 ab_c_123.0 5 ab_c_123.1
原正则不生效的原因
你用的(\w+)_\w+中,\w仅匹配字母、数字和下划线,不包含小数点。所以对于ab_c_1.0这类字符串,它只能匹配到ab_c_1,无法正确提取出用于分组的完整数字标识。调整后的正则_(\d+)\.\d+专门匹配最后下划线后的数字格式,能精准提取分组所需的整数键。
内容的提问来源于stack exchange,提问作者doine
相关产品推荐
相关产品推荐

