熊猫DataFrame-迭代并与之前的值进行比较

时间:2020-07-21 17:17:28

标签: python pandas dataframe

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)

这是示例数据集,其外观应如下图所示

enter image description here

预期输出:

enter image description here

根据排名进行排序。 我正在寻找一个基于排名的,具有最佳“位置1”和“位置2”组合的最终数据框(df2)。 示例:

  • 迭代1:由于这是最好的,因此没有可比较的内容,因此我们直接在新数据框中插入第一条记录 (df2)。

  • 迭代2::如果lcoation1和location2的新数据帧(d2)中存在以下任何位置,则比较Location1和Location2,然后不插入else insert在此示例中,我们需要插入等级之前没有2条记录为“ BB”和“ CC”。

  • 迭代3: **检查新数据帧(d2)中是否存在“ CC”或“ AA”。如果一个或两个存在,请不要将其更新为新的数据框。在这种情况下,它们两个都退出,因此不会将此记录更新为新的数据框。

  • 迭代4::检查新数据框中是否存在DD或EE。我们在新数据框中看不到它们两者,因此将记录更新为新数据框

并遍历每条记录.........

预先感谢

1 个答案:

答案 0 :(得分:4)

使用:

m1 = df[['Location 1', 'Location 2']].stack().duplicated()
m2 = ~m1.any(level=0)
df = df[m2]

详细信息:

使用DataFrame.stack重整列Location 1Location 2Multilevel系列的数据框,并使用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