基于Color列拆分DataFrame:提取全部重复项与非重复项
解决Pandas按列筛选重复/非重复行的问题
需求说明
基于原始DataFrame df1,以Color列为判断重复的唯一依据,生成两个新DataFrame:
df2:包含所有Color值重复的行(即只要某个Color出现多次,该Color对应的所有行都保留)df3:仅保留Color值唯一的行(完全移除存在重复的Color对应的所有行)
原始数据(df1)
| Store | Clothing | Color |
|---|---|---|
| Target | Shirt | Blue |
| Walmart | Shirt | Green |
| JC Penny | Shirt | Orange |
| Target | Shirt | Yellow |
| Target | Pants | Blue |
| Walmart | Socks | Purple |
| JC Penny | Pants | Green |
| Walmart | Socks | Orange |
目标结果
df2(所有重复Color的行)
| Store | Clothing | Color |
|---|---|---|
| Target | Shirt | Blue |
| Walmart | Shirt | Green |
| JC Penny | Shirt | Orange |
| Target | Pants | Blue |
| JC Penny | Pants | Green |
| Walmart | Socks | Orange |
df3(仅保留无重复Color的行)
| Store | Clothing | Color |
|---|---|---|
| Target | Shirt | Yellow |
| Walmart | Socks | Purple |
错误代码分析
第一个代码无法保留全部重复项:
df2 = df1[df1[['Color']].duplicated() == True]duplicated()方法默认仅标记除第一次出现外的重复项,因此只会保留重复组中的后续行,漏掉第一次出现的行(比如Blue的第一行)。第二个代码报错:
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
相关产品推荐
相关产品推荐

