如何用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
相关产品推荐
相关产品推荐

