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

基于Color列拆分DataFrame:提取全部重复项与非重复项

解决Pandas按列筛选重复/非重复行的问题

需求说明

基于原始DataFrame df1,以Color列为判断重复的唯一依据,生成两个新DataFrame:

  • df2:包含所有Color值重复的行(即只要某个Color出现多次,该Color对应的所有行都保留)
  • df3:仅保留Color值唯一的行(完全移除存在重复的Color对应的所有行)

原始数据(df1)

StoreClothingColor
TargetShirtBlue
WalmartShirtGreen
JC PennyShirtOrange
TargetShirtYellow
TargetPantsBlue
WalmartSocksPurple
JC PennyPantsGreen
WalmartSocksOrange

目标结果

df2(所有重复Color的行)

StoreClothingColor
TargetShirtBlue
WalmartShirtGreen
JC PennyShirtOrange
TargetPantsBlue
JC PennyPantsGreen
WalmartSocksOrange

df3(仅保留无重复Color的行)

StoreClothingColor
TargetShirtYellow
WalmartSocksPurple

错误代码分析

  1. 第一个代码无法保留全部重复项:

    df2 = df1[df1[['Color']].duplicated() == True]
    

    duplicated()方法默认仅标记除第一次出现外的重复项,因此只会保留重复组中的后续行,漏掉第一次出现的行(比如Blue的第一行)。

  2. 第二个代码报错:

    df3 = df1.drop_duplicates(subset='Color', keep='none')
    

    Pandas的drop_duplicates方法中,keep参数的合法取值为'first'/'last'/False,没有'none'这个选项,因此会抛出参数错误。

正确实现方法

方法一:使用groupby.transform生成计数列

通过计算每个Color的出现次数,直接筛选符合条件的行:

import pandas as pd

# 初始化原始DataFrame
df1 = pd.DataFrame({
    'Store': ['Target', 'Walmart', 'JC Penny', 'Target', 'Target', 'Walmart', 'JC Penny', 'Walmart'],
    'Clothing': ['Shirt', 'Shirt', 'Shirt', 'Shirt', 'Pants', 'Socks', 'Pants', 'Socks'],
    'Color': ['Blue', 'Green', 'Orange', 'Yellow', 'Blue', 'Purple', 'Green', 'Orange']
})

# 计算每个Color的出现次数,添加为辅助列
df1['color_count'] = df1.groupby('Color')['Color'].transform('count')

# 生成df2:保留所有出现次数>1的Color对应的行
df2 = df1[df1['color_count'] > 1].drop(columns='color_count')

# 生成df3:保留所有出现次数=1的Color对应的行
df3 = df1[df1['color_count'] == 1].drop(columns='color_count')

# 输出验证
print("df2:")
print(df2)
print("\ndf3:")
print(df3)

方法二:使用isin结合value_counts

先提取重复的Color列表,再通过筛选生成目标DataFrame:

import pandas as pd

# 初始化原始DataFrame
df1 = pd.DataFrame({
    'Store': ['Target', 'Walmart', 'JC Penny', 'Target', 'Target', 'Walmart', 'JC Penny', 'Walmart'],
    'Clothing': ['Shirt', 'Shirt', 'Shirt', 'Shirt', 'Pants', 'Socks', 'Pants', 'Socks'],
    'Color': ['Blue', 'Green', 'Orange', 'Yellow', 'Blue', 'Purple', 'Green', 'Orange']
})

# 获取出现次数大于1的Color列表
duplicate_colors = df1['Color'].value_counts()[df1['Color'].value_counts() > 1].index

# 生成df2:保留Color在重复列表中的所有行
df2 = df1[df1['Color'].isin(duplicate_colors)]

# 生成df3:保留Color不在重复列表中的所有行
df3 = df1[~df1['Color'].isin(duplicate_colors)]

# 输出验证
print("df2:")
print(df2)
print("\ndf3:")
print(df3)

两种方法均能准确生成符合要求的df2和df3,可根据个人习惯选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:45:08