Pandas如何按列值首字母区间筛选拆分DataFrame子集
Pandas按指定列首字母区间拆分子集的简洁实现
你目前手动枚举全量字母列表的写法虽然能实现需求,但可维护性很差,后续调整分组区间时需要手动增删列表内的字母,冗余度高。利用英文字母ASCII编码连续排序的特性,完全可以省去枚举字母的步骤,以下是两种更易维护的实现方式:
方案1:直接用字符区间判断(最简洁,适配固定3组拆分场景)
英文字母的ASCII码是连续排列的,直接对首字母做范围判断即可,不需要枚举区间内的所有字母。记得先统一首字母的大小写,避免大小写导致的匹配错误:
# 提取name列首字母并统一转为大写,消除大小写影响 first_char = df['name'].str[0].str.upper() # 直接按字符区间筛选,调整分组仅需修改边界值 df1 = df[first_char.between('A', 'I')] # 首字母A-I的子集 df2 = df[first_char.between('J', 'R')] # 首字母J-R的子集 df3 = df[first_char.between('S', 'Z')] # 首字母S-Z的子集
如果后续需要调整分组范围,比如把A-I调整为A-F,只需要把between('A','I')改成between('A','F')即可,不需要修改长列表。
方案2:用cut方法打分组标签(适合多分组、需要批量处理的场景)
如果后续可能增加分组数量,或者需要批量处理所有子集,可以用pd.cut直接给每行打上分组标签,后续筛选、遍历都更规整:
# 定义分组边界:左闭右开区间,最后一个边界取ASCII码在Z之后的'[',刚好覆盖S-Z范围 bin_edges = ['A', 'J', 'S', '['] group_labels = ['A-I', 'J-R', 'S-Z'] # 将首字母转成对应的ASCII码数值后做分箱打标 df['group_tag'] = pd.cut( x=df['name'].str[0].str.upper().apply(ord), bins=[ord(c) for c in bin_edges], labels=group_labels ) # 可以直接按组遍历处理,不需要单独写3次筛选逻辑 for tag, sub_df in df.groupby('group_tag', observed=True): print(f"分组{tag}共{len(sub_df)}条数据") # 此处可直接对子集做存储、计算等后续操作
注意事项
如果你的数据集里name列存在空值、或者首字母非英文字母的异常数据,可以在拆分前先加一层过滤,避免判断报错:
# 仅保留name首字母为英文字母的行 df = df[df['name'].str[0].str.isalpha()]
内容的提问来源于stack exchange,提问作者GeekGroot
相关产品推荐
相关产品推荐

