我有一个下面的数据框:
import pandas as pd
d = {'id': [1, 2, 3, 4, 4, 6, 1, 8, 9], 'cluster': [7, 2, 3, 3, 3, 6, 7, 8, 8]}
df = pd.DataFrame(data=d)
df = df.sort_values('cluster')
我想保留所有行 如果有相同的簇但不同的 id 并保留该簇中的每一行 即使它是相同的 id,因为该集群内至少有一次不同的 id。 我用来实现此目的的代码如下,但是,唯一的问题 对于我正在寻找的内容来说,它丢弃了太多行。
df = (df.assign(counts=df.count(axis=1))
.sort_values(['id', 'counts'])
.drop_duplicates(['id','cluster'], keep='last')
.drop('counts', axis=1))
输出数据帧我期望上面的代码不会这样做 会在以下位置删除行 数据帧索引 1、5、0 和 6,但保留数据帧索引 2、3、4、7 和 8。本质上 导致以下代码产生的结果:
df = df.loc[[2, 3, 4, 7, 8]]
我已经看过许多有关堆栈溢出的重复数据删除 pandas 帖子,但尚未找到这个 设想。任何帮助将不胜感激。
最佳答案
我认为我们可以用一个 bool 值来做到这一点。使用.groupby().nunique()
con1 = df.groupby('cluster')['id'].nunique() > 1
#of these we only want the True indexes.
cluster
2 False
3 True
6 False
7 False
8 True
df.loc[(df['cluster'].isin(con1[con1].index))]
id cluster
2 3 3
3 4 3
4 4 3
7 8 8
8 9 8
关于具有复杂标准的 python pandas 重复数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66297414/