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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:41:08