import pandas as pd
data = {'Unique_ID': [44,66,12,76,57,83],
'Location 1': ['AA', 'BB','CC','DD','EE','FF'],
'Location 2': ['FF', 'CC','AA','EE','BB','CC'],
'Rank':[1,2,3,4,5,6]
}
pd.DataFrame (data)
这是示例数据集,其外观应如下图所示
预期输出:
根据排名进行排序。 我正在寻找一个基于排名的,具有最佳“位置1”和“位置2”组合的最终数据框(df2)。 示例:
迭代1:由于这是最好的,因此没有可比较的内容,因此我们直接在新数据框中插入第一条记录 (df2)。
迭代2::如果lcoation1和location2的新数据帧(d2)中存在以下任何位置,则比较Location1和Location2,然后不插入else insert在此示例中,我们需要插入等级之前没有2条记录为“ BB”和“ CC”。
迭代3: **检查新数据帧(d2)中是否存在“ CC”或“ AA”。如果一个或两个存在,请不要将其更新为新的数据框。在这种情况下,它们两个都退出,因此不会将此记录更新为新的数据框。
迭代4::检查新数据框中是否存在DD或EE。我们在新数据框中看不到它们两者,因此将记录更新为新数据框
并遍历每条记录.........
预先感谢
答案 0 :(得分:4)
使用:
m1 = df[['Location 1', 'Location 2']].stack().duplicated()
m2 = ~m1.any(level=0)
df = df[m2]
详细信息:
使用DataFrame.stack
重整列Location 1
和Location 2
至Multilevel
系列的数据框,并使用Series.duplicated
创建遮罩m1
。
print(m1)
0 Location 1 False
Location 2 False
1 Location 1 False
Location 2 False
2 Location 1 True
Location 2 True
3 Location 1 False
Location 2 False
4 Location 1 True
Location 2 True
5 Location 1 True
Location 2 True
dtype: bool
在掩码level=0
上的m1
上使用Series.any
,并将其取反以创建新的布尔掩码m2
。感谢@ScottBoston的建议。
print(m2)
0 True
1 True
2 False
3 True
4 False
5 False
dtype: bool
最后使用此掩码m2
过滤数据框中的行:
print(df)
Unique_ID Location 1 Location 2 Rank
0 44 AA FF 1
1 66 BB CC 2
3 76 DD EE 4