如何在Pandas DataFrame中处理重复记录并生成新列存储指定值
Pandas重复记录合并与特定值迁移实现方案
需求回顾
- 按
key1、key2、key3分组,每组最多两条重复记录 - 当组内存在一行
value2为copy、另一行为NaN时,将copy行的value值迁移到NaN行的新列new_value2 - 最终删除
value2为copy的原行
解决方案代码(高效版)
import pandas as pd import numpy as np df = pd.DataFrame({ 'key1': ['a', 'b', 'c', 'c', 'd', 'e', 'f', 'f', 'g'], 'key2': [23423, 4565, 7777, 7777, 9789, 567567, 3333, 3333, 1246], 'key3': [1, 2, 3, 3, 4, 5, 6, 6, 7], 'value': [23453, 345, 234 ,556, 4, 5678, 56767, 2348, 932], 'value2': [np.nan, np.nan, np.nan, 'copy', np.nan, np.nan, np.nan, 'copy', np.nan] }) # 分组提取copy行的value值,映射到对应组的new_value2列 df['new_value2'] = df.groupby(['key1', 'key2', 'key3'])['value'].transform( lambda x: x[df.loc[x.index, 'value2'] == 'copy'].iloc[0] if len(x) > 1 else np.nan ) # 过滤掉value2为copy的行,重置索引 df = df[df['value2'].isna()].reset_index(drop=True) print(df)
代码分步解释
- 分组映射值:通过
groupby+transform实现组内操作,判断组内是否有重复记录(长度>1),如果有则定位到value2为copy的行,提取其value并赋值给整个组的new_value2列。 - 过滤删除冗余行:直接筛选出
value2为NaN的行,保留需要的目标行,自动移除copy行。 - 重置索引:避免过滤后索引不连续的问题。
替代实现方案(直观版)
如果觉得transform逻辑有点绕,也可以用更直白的分步处理:
# 1. 提取所有copy行的分组键和对应value值 copy_data = df[df['value2'] == 'copy'][['key1', 'key2', 'key3', 'value']].rename(columns={'value': 'new_value2'}) # 2. 合并原数据与copy数据,匹配对应组的new_value2 df = df.merge(copy_data, on=['key1', 'key2', 'key3'], how='left') # 3. 过滤掉copy行,保留目标行 df = df[df['value2'].isna()].reset_index(drop=True)
这个方案通过merge操作将copy行的值匹配到对应组,逻辑更清晰,适合新手理解。
内容的提问来源于stack exchange,提问作者ChesuCR
相关产品推荐
相关产品推荐

