在不考虑订单的情况下,检查熊猫行是否唯一

时间:2020-09-28 16:03:26

标签: python-3.x pandas dataframe drop-duplicates

我想知道是否有一种方法可以检查然后删除某些不唯一的行?

我的数据框看起来像这样:

    ID1 ID2 weight  
 0  2   4   0.5
 1  3   7   0.8 
 2  4   2   0.5 
 3  7   3   0.8
 4  8   2   0.5
 5  3   8   0.5

编辑:我添加了几行,以表明应该保留其他相同权重的唯一行。

我认为当我使用熊猫drop_duplicates(subset=['ID1', 'ID2','weight'], keep=False)时,它会单独考虑每一行,但不能识别出第0行,第2行,第1行和第4行实际上是相同的值吗?

2 个答案:

答案 0 :(得分:4)

将数据帧沿axis=1排序,然后将np.unique与可选参数return_index=True一起使用以获取唯一元素的索引:

sub = ['ID1', 'ID2', 'weight']

idx = np.unique(np.sort(df[sub], 1), axis=0, return_index=True)[1]
df1 = df.iloc[sorted(idx)]

@anky建议的替代方法:

df1 = df[~pd.DataFrame(np.sort(df[sub], 1), index=df.index).duplicated()]

print(df1)

   ID1  ID2  weight
0    2    4     0.5
1    3    7     0.8
4    8    2     0.5
5    3    8     0.5

答案 1 :(得分:1)

这可行,但有点怪异。从应该成对的列中创建集合并转换为元组以获取可哈希的类型

df['new'] = df[['ID1','ID2']].apply(lambda x: tuple(set(x)), axis=1)
df.drop_duplicates(subset=['new','weight'], keep=False)

出局:

   ID1  ID2  weight     new
4    8    2     0.5  (8, 2)
5    3    8     0.5  (8, 3)