如何基于列值子串拆分百万级Pandas DataFrame至多数据结构
高效拆分大Pandas DataFrame(基于子串匹配)
嘿,这个需求我太熟了——处理百万级别的DataFrame时,按name列的子串拆分并存到字典里是非常实用的操作。下面给你两种靠谱的方法,兼顾效率和可读性:
方法一:循环匹配子串(直观易懂,适合子串数量少的场景)
这种方法逻辑直白,新手也能快速上手:先列出要匹配的子串,然后逐个筛选对应的行,存到字典里就行。
import pandas as pd # 模拟你的百万行DataFrame(实际使用时替换成你的数据) df = pd.DataFrame({ 'name': ['bob smith', 'jake miller', 'sam jones', 'alice brown', 'bob johnson'] * 200000, # 模拟百万行 'age': [30, 25, 35, 28, 32] * 200000, 'city': ['NY', 'LA', 'Chicago', 'Boston', 'Seattle'] * 200000 }) # 定义要匹配的目标子串 target_substrings = ['bob', 'jake', 'sam'] # 初始化存储结果的字典 split_dfs = {} # 遍历每个子串,筛选并存储 for substring in target_substrings: # 用str.contains匹配子串,case=False忽略大小写,na=False跳过空值 match_mask = df['name'].str.contains(substring, case=False, na=False) # 用.copy()创建副本,避免后续修改子DataFrame时影响原数据 split_dfs[substring] = df[match_mask].copy() # 验证结果(实际使用时可省略) for key, sub_df in split_dfs.items(): print(f"--- 匹配'{key}'的DataFrame(前5行)---") print(sub_df.head())
方法一的优缺点
- ✅ 优点:逻辑简单,容易调试,适合子串数量不多的情况
- ⚠️ 缺点:如果子串数量特别多(比如上百个),循环会稍慢,但百万行数据下依然能接受
方法二:矢量化分组(更优雅,适合子串数量多的场景)
如果你的目标子串很多,或者想把不匹配的行统一归到“其他”组,用np.select结合groupby的方法更高效,也更整洁:
import pandas as pd import numpy as np # 同样模拟百万行DataFrame df = pd.DataFrame({ 'name': ['bob smith', 'jake miller', 'sam jones', 'alice brown', 'bob johnson'] * 200000, 'age': [30, 25, 35, 28, 32] * 200000, 'city': ['NY', 'LA', 'Chicago', 'Boston', 'Seattle'] * 200000 }) target_substrings = ['bob', 'jake', 'sam'] # 构建匹配条件列表 match_conditions = [df['name'].str.contains(sub, case=False, na=False) for sub in target_substrings] # 构建对应条件的分组名称 group_names = target_substrings # 用np.select生成分组列,不匹配的行归为'other' df['group'] = np.select(match_conditions, group_names, default='other') # 按分组列拆分,转成字典(自动去掉分组列的话可以用drop) split_dfs = { group: sub_df.drop('group', axis=1) for group, sub_df in df.groupby('group') } # 验证结果(实际使用时可省略) for key, sub_df in split_dfs.items(): print(f"--- 分组'{key}'的DataFrame(前5行)---") print(sub_df.head())
方法二的优缺点
- ✅ 优点:矢量化操作效率更高,适合子串数量多的场景,还能统一处理不匹配的行
- ✅ 优点:代码更简洁,结构清晰
关键注意事项
- 大小写处理:如果不需要区分大小写,一定要加
case=False(str.contains)或者转成小写后匹配,避免漏匹配 - 空值处理:
str.contains里加na=False,避免空值导致筛选出错 - 副本与视图:记得用
.copy()创建子DataFrame的副本,否则修改子DataFrame时可能会影响原数据(Pandas会抛出警告) - 性能优化:百万行数据下,矢量化操作(比如方法二的
np.select)比循环或apply更快,优先选择
内容的提问来源于stack exchange,提问作者bwrabbit
相关产品推荐
相关产品推荐

