使用 python 和 pandas 中的条件创建数据框的子集

Dev*_*022 0 python if-statement subset dataframe pandas

假设我有这个数据框,我想根据以下条件创建它的子集。

df=pd.DataFrame({'file':[1205,2897,1205,1205,4312,1322,1242,52,2897,111],
                         'department':[finance,finance,IT,marketing,marketing,IT,finance,IT,marketing,IT],
                         'status':[1,1,1,1,1,1,1,1,1,1],
                         })
Run Code Online (Sandbox Code Playgroud)
   file department  status
0   1205    finance       1
1   2897    finance       1
2   1205       IT         1
3   1205    marketing     1
4   4312    marketing     1
5   1322       IT         1
6   1242    finance       1
7   52         IT         1
8   2897    marketing     1
9   111        IT         1
Run Code Online (Sandbox Code Playgroud)
  • 如果该文件存在于财务中并存在于IT中,则将其从 财务中删除并保留在IT中
  • 如果该文件存在于财务营销中,并且从 FIRST 2 中删除并保留在其中
  • 如果该文件存在于财务营销中,则从第一个删除并将其保留在营销中
  • 如果该文件存在于营销IT中,请从
    第一个删除并将其保留在IT中

预期结果:

   file department  status
0   1205       IT         1
1   2897    marketing     1
2   4312    marketing     1
3   1322       IT         1
4   1242    finance       1
5   52         IT         1
6   111        IT         1
Run Code Online (Sandbox Code Playgroud)

Cor*_*ien 5

用于CategoricalDtype创建有序集合,例如'finance' < 'marketing' < 'IT'

cat = pd.CategoricalDtype(['finance', 'marketing', 'IT'], ordered=True)
out = (df.astype({'department': cat}).sort_values('department')
         .drop_duplicates('file', keep='last').sort_index())
print(out)

# Output
   file department  status
2  1205         IT       1
4  4312  marketing       1
5  1322         IT       1
6  1242    finance       1
7    52         IT       1
8  2897  marketing       1
9   111         IT       1
Run Code Online (Sandbox Code Playgroud)