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

如何基于列值子串拆分百万级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:19:55