【问题标题】:Filter dataframe columns using multiple dictionaries使用多个字典过滤数据框列
【发布时间】:2021-04-28 16:19:35
【问题描述】:

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

d = [['Dept1'  ,               'HR'  ,        'Talent'     ,     'Good Employee 3'],
    ['Dept2'  ,               'IT'   ,      'Garbage'  ,  'Analysis HR 2'],
       ['Dept3'   ,              'IT'  ,        'Tech Sup' ,           'IT Tech 2'],
      [ 'Dept4'   ,              'HR'  ,        'Hardware' ,        'Trash Data' ] ,             
      [ 'Dept5'   ,              'MKT'  ,         'Sales'  ,         'Facebook Promo 1'],
       ['Dept6'   ,              'MKT'  ,       NaN,     '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 Data              
4        Dept5                 MKT           Sales           Facebook Promo 1
5        Dept6                 MKT        NaN               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 Data               
4        Dept5                 MKT           Sales           Facebook Promo 1
5        Dept6                 MKT           NaN             Car profit 

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

感谢您的支持!

【问题讨论】:

    标签: python pandas dictionary lambda filter


    【解决方案1】:

    将您的 dicts 读入 DataFrame,重新整形并将它们合并在一起,这样您就可以形成 ['Function', 'Subfunction', 'Sub-Subfunction'] 的所有允许组合的 DataFrame。然后使用 'left' 与指标合并,我们可以查询不匹配的指标并仅返回该子集。

    df1 = (pd.DataFrame.from_dict(subfunction, orient='index')
             .stack()
             .reset_index()
             .drop(columns='level_1')
             .rename(columns={'level_0': 'Function', 0: 'Subfunction'}))
    
    df2 = (pd.DataFrame.from_dict(sub_subfunction, orient='index')
             .stack()
             .reset_index()
             .drop(columns='level_1')
             .rename(columns={'level_0': 'Subfunction', 0: 'Sub-subfunction'}))
    
    # All allowable combinations 
    key = df1.merge(df2)
    
    res = (df.merge(key, indicator=True, how='left')
             .query('_merge == "left_only"')
             .drop(columns='_merge'))
    

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

    【讨论】:

    • 您好,这是返回“功能”正确的所有行。是因为我要清理的数据框还包含空白单元格吗?可能是由于每列的类型?无论如何,我都尝试修复,但我无法
    • @PauloCortez 是的,您有空白单元格,这将不起作用,因为 NaN 不会匹配任何内容。或者,如果您的单元格有前导/尾随空格。在这种情况下,有其他方法可以得到你想要的,但它与你提供的数据不匹配。
    • 抱歉,感谢您提供的信息。我在“汽车利润”和 NaN 值之后添加了尾随空格,以更好地模拟我的实际数据
    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 2020-11-24
    • 2019-12-27
    • 2021-08-02
    • 2022-11-13
    • 2017-04-22
    • 2019-04-04
    • 2023-01-04
    相关资源
    最近更新 更多