如何拆分DataFrame:将col1、col2同但col3不同的记录移至新DataFrame
问题解决:按col1/col2分组筛选col3唯一的记录
给定如下DataFrame(其中col3、col4的值为列表类型):
col1 col2 col3 col4 x y [z] [w] x y [s] [w] c d [a] [b] c d [f] [g] t p [q] [l] t p [q] [w]
需求:
- 将col1、col2值相同但col3值存在差异的记录从原DataFrame移除,放入新DataFrame
- 原DataFrame仅保留col1/col2分组内col3值完全一致的记录
实现步骤
由于列表是不可哈希类型,无法直接用于分组统计,需先将col3转换为可哈希的元组,再进行分组判断:
代码示例
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'col1': ['x', 'x', 'c', 'c', 't', 't'], 'col2': ['y', 'y', 'd', 'd', 'p', 'p'], 'col3': [['z'], ['s'], ['a'], ['f'], ['q'], ['q']], 'col4': [['w'], ['w'], ['b'], ['g'], ['l'], ['w']] }) # 1. 新增临时列,将col3的列表转为元组(可哈希类型) df['col3_tuple'] = df['col3'].apply(tuple) # 2. 按col1、col2分组,统计每组内col3的唯一值数量 group_unique_count = df.groupby(['col1', 'col2'])['col3_tuple'].nunique() # 3. 筛选出需要保留的分组:唯一值数量为1(即该分组内col3无差异) keep_groups = group_unique_count[group_unique_count == 1].index # 4. 拆分DataFrame original_df = df[df.set_index(['col1', 'col2']).index.isin(keep_groups)].drop('col3_tuple', axis=1) new_df = df[~df.set_index(['col1', 'col2']).index.isin(keep_groups)].drop('col3_tuple', axis=1) # 输出结果 print("处理后原DataFrame:") print(original_df) print("\n新DataFrame:") print(new_df)
代码说明
- 列表转元组:解决列表无法作为分组统计依据的问题,转成元组后可正常计算唯一值数量
- 分组统计:通过
groupby+nunique()获取每个(col1,col2)分组内col3的不同值数量 - 筛选拆分:用
isin和取反~分别筛选出需保留和移出的记录,最后删除临时列还原数据结构
内容的提问来源于stack exchange,提问作者Jakub Sapko
相关产品推荐
相关产品推荐

