Python 3.x 如何使用python根据基于列值的优先级过滤数据帧?

Python 3.x 如何使用python根据基于列值的优先级过滤数据帧?,python-3.x,pandas,numpy,Python 3.x,Pandas,Numpy,我有一个包含名称和职业优先级1、2和3的数据框。 我想根据优先级过滤数据帧。 如果第一个控制器进入第一列,它应该停止,否则继续其他列。 第二个参与者若进入第一列,则应停止,否则继续其他列 输入数据帧: primaryName prof1 prof2 prof3 0 jordan belfort producer actor writer 1 martin scorsese producer director actor 2

我有一个包含名称和职业优先级1、2和3的数据框。 我想根据优先级过滤数据帧。 如果第一个控制器进入第一列,它应该停止,否则继续其他列。 第二个参与者若进入第一列,则应停止,否则继续其他列

输入数据帧:

       primaryName      prof1     prof2   prof3
0     jordan belfort  producer     actor  writer
1    martin scorsese  producer  director   actor
2  leonardo dicaprio     actor  producer  writer
3         jonah hill     actor  producer  writer
输出数据帧

   primaryName
0 martin scorsese
1 leonardo dicaprio
2 jonah hill

它首先定义了你职业的分类顺序。这假设列的顺序如图所示

cat = (pd.Categorical(['director','actor', 'writer', 'producer'], ordered=True)
         .reorder_categories(['director','actor', 'writer', 'producer'])
      )

# stack to be able to sort by column name
# then sort_values
new_df = (test_df.stack()
        .astype(cat).cat.codes
        .reset_index()
        .sort_values([0,'level_1'])
        .groupby('primaryName', as_index=False)
        .first()
)

# get the correct order by merge:
(test_df.merge(new_df, on='primaryName')
 .sort_values([0,'level_1'])['primaryName']
)
输出:

1      martin scorsese
2    leonardo dicaprio
3           jonah hill
0       jordan belfort
Name: primaryName, dtype: object

这让我有点困惑。你能稍微澄清一下吗?也许能给你的测试数据增加一点复杂度,得到预期的结果。