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

如何用Pandas按唯一列对提取对应行并生成子数据帧?

基于Pandas按唯一列对筛选数据行的高效方法

问题场景

现有如下结构的DataFrame:

col1  col2   col3
0     1    10    [a, b, c, d]
1     1    10    [e, f, g, h]
2     2    11    [a, b, c, d]   
3     3    12    [i, j, k, l]   
4     3    12    [e, f, g, h]
5     5    14    [a, b, c, d]   
6     3    10    [m, n, o, p] 

需要按col1和col2的唯一列对,将原数据拆分为以(col1, col2)元组为键的子DataFrame集合,同时避免低效循环。

高效解决方案:使用groupby

直接利用Pandas的groupby方法,这是最优实现方式,内部经过性能优化,远胜于手动循环:

import pandas as pd

# 读取或构造示例DataFrame
data = {
    'col1': [1, 1, 2, 3, 3, 5, 3],
    'col2': [10, 10, 11, 12, 12, 14, 10],
    'col3': [['a','b','c','d'], ['e','f','g','h'], ['a','b','c','d'], 
             ['i','j','k','l'], ['e','f','g','h'], ['a','b','c','d'], ['m','n','o','p']]
}
df = pd.DataFrame(data)

# 按col1和col2分组,转换为字典(键为(col1, col2)元组)
df_uniq_dict = dict(tuple(df.groupby(['col1', 'col2'])))

# 访问指定分组
print(df_uniq_dict[(1, 10)])
print(df_uniq_dict[(2, 11)])
print(df_uniq_dict[(3, 12)])

结果示例

执行后可直接通过元组键获取对应子DataFrame:

  • df_uniq_dict[(1,10)]输出:
col1  col2        col3
0      1    10  [a, b, c, d]
1      1    10  [e, f, g, h]
  • df_uniq_dict[(2,11)]输出:
col1  col2        col3
2      2    11  [a, b, c, d]
  • df_uniq_dict[(3,12)]输出:
col1  col2        col3
3      3    12  [i, j, k, l]
4      3    12  [e, f, g, h]

方案说明

  • 你之前尝试的df.merge(df_unique, on=['col1', 'col2'], how='left')只会返回原数据,无法实现拆分分组的需求。
  • 手动循环遍历每个唯一列对再筛选,会重复查询DataFrame,数据量越大性能越差,时间复杂度为O(n*k)(n为唯一对数量,k为原数据行数);而groupby是一次遍历完成分组,时间复杂度为O(k),性能优势显著。

内容的提问来源于stack exchange,提问作者Bob R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:20:20