Python 从两列中选择唯一的值
我找不到任何优雅的方法从列A和列B中选择唯一的行,但不能同时选择,也不能按顺序选择。这是为了保持这两列中唯一值的包含交集 我的目标是在A列和B列之间保留尽可能多的唯一值。这些列是联合考虑的,但我正在寻找它们的值的所有唯一组合 示例数据帧Python 从两列中选择唯一的值,python,pandas,filter,unique,drop-duplicates,Python,Pandas,Filter,Unique,Drop Duplicates,我找不到任何优雅的方法从列A和列B中选择唯一的行,但不能同时选择,也不能按顺序选择。这是为了保持这两列中唯一值的包含交集 我的目标是在A列和B列之间保留尽可能多的唯一值。这些列是联合考虑的,但我正在寻找它们的值的所有唯一组合 示例数据帧 df1 = pd.DataFrame({"A": [ "A1", "A2", "A2", "A3", "A3", ], "B": [ "B1", "B1", "B2", "B3", "B1", ], },
df1 = pd.DataFrame({"A": [ "A1", "A2", "A2", "A3", "A3", ],
"B": [ "B1", "B1", "B2", "B3", "B1", ], },
index=[ 0, 1, 2, 3, 4, ])
结果:
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
3 A3 B3
这没什么用
df2 = df1.drop_duplicates( subset=[ "A", "B", ], keep="first", inplace=False, )
结果:
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
3 A3 B3
下面的代码留下了重复的B1,可以稍后使用B列上的drop_duplicates删除,但A2也将被删除,如果它与B2一起出现在一行中,则可以保留它,因为它位于原始数据帧的索引=2处
df3 = df1.drop_duplicates( subset=[ "A", ], keep="first", inplace=False, )
df4 = df3.drop_duplicates( subset=[ "B", ], keep="first", inplace=False, )
A B
0 A1 B1
3 A3 B3
结果:
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
2 A2 B2
3 A3 B3
4 A3 B1
A B
0 A1 B1
1 A2 B1
3 A3 B3
如上所述,A2被删除,但如果它与B2一起出现在一行中,则可以选择保留它,因为它位于原始数据帧的索引=2处
df3 = df1.drop_duplicates( subset=[ "A", ], keep="first", inplace=False, )
df4 = df3.drop_duplicates( subset=[ "B", ], keep="first", inplace=False, )
A B
0 A1 B1
3 A3 B3
预期结果:
因此,我的目标是在A列和B列之间保留尽可能多的唯一值。这些列是联合考虑的,但我正在寻找它们值的所有唯一组合…请尝试以下代码:
df1.drop_duplicates( subset=[ "A" and "B"], keep="first", inplace=False, )
输出:
A B
0 A1 B1
2 A2 B2
3 A3 B3
如果在原始数据帧['A3',B4']中再添加一行,会发生什么。该行是否也应显示在输出中?现在,我不知道您是在尝试获取具有完全唯一值的最大行数,还是获取捕获所有唯一值的最小行数。我不介意输出中是否出现行['A3',B4',因为我可以在下一步中通过删除A列中的重复项来过滤掉它。我要做的是从A列中获取所有值,但只获取一次,因此此列仅包含唯一值,但与B列中的唯一值成对。现在,如果使用subset=[A,B],则输出包含两个列中唯一的行。如果我先从A列中删除重复项,然后从B列中删除重复项,许多唯一值将丢失。我需要从一列中删除重复项,但要尽可能多地保存B列中的值,反之亦然……可能需要使用networkx.algorithms.matching.max_weight_matching?Alex,你需要两列的唯一值,对吗?那么你怎么认为下面的代码不适用呢?