【问题标题】:If a pandas df column has a specific value, another column only allow a list of values如果 pandas df 列具有特定值,则另一列仅允许值列表
【发布时间】:2021-04-27 19:48:22
【问题描述】:

我有一个数据框,它有一个部门、它的功能、它的子功能和它的子子功能。数据框的示例如下:

d = [['Dept1'  ,               'HR'  ,        'Talent'     ,     'Good Employee 3'],
    ['Dept2'  ,               'IT'   ,      'Garbage'  ,  'Analysis HR 2'],
       ['Dept3'   ,              'IT'  ,        'Tech Sup' ,           'IT Tech 2'],
      [ 'Dept4'   ,              'HR'  ,        'Hardware' ,        'Trash Can' ] ,             
      [ 'Dept5'   ,              'MKT'  ,         'Sales'  ,         'Facebook Promo 1'],
       ['Dept6'   ,              'MKT'  ,       'Communication',     'Car profit']]
df = pd.DataFrame(d, columns=['Department', 'Function' ,     'Subfunction' ,  'Sub-subfunction'])

       Department           Function      Subfunction   Sub-subfunction
0        Dept1                 HR          Talent          Good Employee 3
1        Dept2                 IT         Garbage     Analysis HR 2
2        Dept3                 IT          Tech Sup            IT Tech 2
3        Dept4                 HR          Hardware         Trash Can               
4        Dept5                 MKT           Sales           Facebook Promo 1
5        Dept6                 MKT         Communication     Car profit

我需要创建一个规则来检查部门是否在功能中具有特定值,它只允许子功能中可能的值列表。然后,在子函数中,每个唯一值将只允许子函数中可能的值列表。

映射如下:

subfunction = {'HR': ['Talent', 'Analysis Human'],
              'IT': ['Tech Sup', 'Hardware'],
              'MKT': ['Sales', 'Communication']}

sub_subfunction = {'Talent': ['Good Employee 1', 'Good Employee 2', 'Good Employee 3'],
                   'Analysis Human': [ 'Analysis HR 1', 'Analysis HR 2', 'Analysis HR 3'],
                   'Tech Sup': ['IT Tech 1', 'IT Tech 2', 'IT Tech 3', 'Tech Master'],
                   'Hardware': ['PC pieces', 'Phone pieces'],
                   'Sales': ['Car profit', 'Bolt profit'],
                   'Communication': ['Facebook Promo 1', 'Instagram Promo 1']}

在这个数据帧中,这个函数会返回那些不遵守这个规则的,在这个例子中它会返回:

       Department           Function      Subfunction   Sub-subfunction
1        Dept2                 IT         Garbage    Analysis HR 2
3        Dept4                 HR          Hardware         Trash Can               
4        Dept5                 MKT           Sales           Facebook Promo 1
5        Dept6                 MKT         Communication     Car profit

应用这些规则的最佳方式是什么? 如您所见,数据框的值可以在映射字典的值之外(尽管如果帮助太大,我可以将“函数”值全部映射到子函数字典中)。

如果它也有帮助,它可以分步实现。先用条件处理函数/子函数映射,然后分别处理子函数/子子函数的每个条件(虽然确实不太理想)

感谢您的支持!

【问题讨论】:

    标签: python pandas if-statement filter conditional-statements


    【解决方案1】:
    subfunction = {'HR': ['Talent', 'Analysis Human'],
                  'IT': ['Tech Sup', 'Hardware'],
                  'MKT': ['Sales', 'Communication']}
    sub_subfunction = {'Talent': ['Good Employee 1', 'Good Employee 2', 'Good Employee 3'],
                       'Analysis Human': [ 'Analysis HR 1', 'Analysis HR 2', 'Analysis HR 3'],
                       'Tech Sup': ['IT Tech 1', 'IT Tech 2', 'IT Tech 3', 'Tech Master'],
                       'Hardware': ['PC pieces', 'Phone pieces'],
                       'Sales': ['Car profit', 'Bolt profit'],
                       'Communication': ['Facebook Promo 1', 'Instagram Promo 1']}
    
    df[~((df.apply(lambda x: x[2] in subfunction[x[1]], axis=1)) & (df.apply(lambda x: x[3] in sub_subfunction[x[2]], axis=1)))]
    

    输出

    Department  Function    Subfunction Sub-subfunction
    1   Dept2   IT  Analysis Human  Analysis HR 2
    3   Dept4   HR  Hardware    Good Employee 1
    4   Dept5   MKT Sales   Facebook Promo 1
    5   Dept6   MKT Communication   Car profit
    

    【讨论】:

    • 我不明白如何在同一行中添加所有条件,这样您就必须一个一个过滤,不是吗?
    • 首先将df.apply(lambda x: x[1] in x[2], axis=1)df.apply(lambda x: x[2] in x[3], axis=1) 评估执行的&。您可以添加所有条件,而不是一一做。
    • 能否请您使用我在示例中提供的变量和硬代码?对于“功能”列中的每个值,在子功能中都有一个可能值列表,对于每个值,在子子功能中都有一个列表。您如何同时评估所有 3 个功能类别?
    • 这取决于你,你想忽略它还是保留它。取决于你可以修改代码。
    • 好的,我刚刚重新更正了代码。基本上我想知道如何使用那些具有多个条目的字典来过滤一列(即使在数据框中有映射字典之外的值)。非常感谢!
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 2020-09-03
    • 2011-02-20
    • 1970-01-01
    • 2020-12-13
    • 2018-09-25
    • 2013-07-28
    • 2017-10-10
    相关资源
    最近更新 更多