在不考虑顺序时检查 pandas 行是否唯一
Check if pandas row is unique, when order is not considered
我想知道是否有一种方法可以检查然后删除某些不唯一的行?
我的数据框看起来像这样:
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
编辑:我添加了更多行以表明应保留可能具有相同权重的其他唯一行。
我认为当我使用 pandas drop_duplicates(subset=['ID1', 'ID2','weight'], keep=False)
时,它会单独考虑每一行,但无法识别第 0 行和第 2 行以及第 1 行和第 4 行实际上是相同的值吗?
这行得通,但有点老套。从应该成对的列创建集合并转换为元组以获得可哈希类型
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)
沿 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
我想知道是否有一种方法可以检查然后删除某些不唯一的行?
我的数据框看起来像这样:
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
编辑:我添加了更多行以表明应保留可能具有相同权重的其他唯一行。
我认为当我使用 pandas drop_duplicates(subset=['ID1', 'ID2','weight'], keep=False)
时,它会单独考虑每一行,但无法识别第 0 行和第 2 行以及第 1 行和第 4 行实际上是相同的值吗?
这行得通,但有点老套。从应该成对的列创建集合并转换为元组以获得可哈希类型
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)
沿 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