Python 使用多个字典筛选dataframe列

Python 使用多个字典筛选dataframe列,python,pandas,dictionary,lambda,filter,Python,Pandas,Dictionary,Lambda,Filter,我有一个数据框架,它有一个部门、它的功能、它的子功能和它的子功能。数据帧的一个示例如下: d=['Dept1','HR','Talent','Good Employee 3'], ['Dept2','IT','Garbage','Analysis HR 2'], ['Dept3','IT','Tech Sup','IT Tech 2'], [‘Dept4’、‘HR’、‘硬件’、‘垃圾数据’], [‘Dept5’、‘MKT’、‘Sales’、‘Facebook促销1’], ['Dept6','MK

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

d=['Dept1','HR','Talent','Good Employee 3'],
['Dept2','IT','Garbage','Analysis HR 2'],
['Dept3','IT','Tech Sup','IT Tech 2'],
[‘Dept4’、‘HR’、‘硬件’、‘垃圾数据’],
[‘Dept5’、‘MKT’、‘Sales’、‘Facebook促销1’],
['Dept6','MKT',NaN',汽车利润]]
df=pd.DataFrame(d,列=['Department'、'Function'、'Subfunction'、'subsubfunction'])
我需要创建一个规则来检查一个部门是否在函数中有某个值,它只允许在子函数中有一个可能的值列表。然后,在相同的子函数中,每个唯一值将只允许子函数中可能的值列表

映射将如下所示:

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 
应用这些规则的最佳方式是什么? 如您所见,dataframe的值可以在映射字典的值之外(尽管我可以将“函数”值全部映射到子函数字典中,如果这太有帮助的话)


谢谢你的支持

将您的DICT读入数据框,重新塑造,并将它们合并在一起,从而形成所有允许的
['Function'、'Subfunction'、'subsubsubfunction']
组合的数据框。然后使用带有指示器的
'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'))


您好,这将返回“函数”正确的所有行。是否因为要清理的数据框也包含空白单元格?可能是因为每列的类型?不管怎样,我试着把这两个问题都解决了,但我做不到t@PauloCortez是的,如果您有空白单元格,这将不起作用,因为
NaN
与任何内容都不匹配。或者如果单元格有前导/尾随空格。在这种情况下,有其他方法可以获取您想要的内容,但与您提供的数据不匹配。抱歉,谢谢您提供的信息。我在“汽车利润”和NaN值后添加了尾随空格,以便更好地模拟我的实际数据
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