熊猫:删除重复索引的所有记录

asb*_*asb 11 duplicates pandas

我有一个数据集,可能有重复的标识符记录appkey.理想情况下,重复的记录应该不存在,因此我将它们视为数据收集错误.我需要删除appkey多次出现的所有实例.

drop_duplicates方法在这种情况下是无效的(或者是?),因为它选择了第一个或最后一个重复项.是否有任何明显的成语用熊猫实现这一目标?

Dan*_*lan 7

截至pandas版本0.12,我们有filter此.它完全符合@Andy的解决方案所使用的功能transform,但更简洁,更快一些.

df.groupby('AppKey').filter(lambda x: x.count() == 1)
Run Code Online (Sandbox Code Playgroud)

窃取@Andy的例子,

In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['AppKey', 'B'])

In [2]: df.groupby('AppKey').filter(lambda x: x.count() == 1)
Out[2]: 
   AppKey  B
2       5  6
Run Code Online (Sandbox Code Playgroud)


And*_*den 6

这是一种方法,使用带有count 的变换:

In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['AppKey', 'B'])

In [2]: df
Out[2]:
   AppKey  B
0       1  2
1       1  4
2       5  6
Run Code Online (Sandbox Code Playgroud)

通过AppKey列进行分组并应用转换计数,意味着计算每次出现的AppKey,并将计数分配给出现的那些行:

In [3]: count_appkey = df.groupby('AppKey')['AppKey'].transform('count')

In [4]: count_appkey
Out[4]:
0    2
1    2
2    1
Name: AppKey, dtype: int64

In [5]: count_appkey == 1
Out[5]:
0    False
1    False
2     True
Name: AppKey, dtype: bool
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其用作原始DataFrame的布尔掩码(仅保留AppKey恰好出现一次的那些行):

In [6]: df[count_appkey == 1]
Out[6]:
   AppKey  B
2       5  6
Run Code Online (Sandbox Code Playgroud)