Python 映射到多个字典项以对数据进行分类

Python 映射到多个字典项以对数据进行分类,python,pandas,dictionary,Python,Pandas,Dictionary,我有一个大数据框,其中包含一个'Description'列 我已经编译了一个相当大的列表字典,其中键基本上是类别,项目是描述列中包含的可能(子)字符串的列表。 我想使用字典根据这个描述对数据框中的每个条目进行分类。。。不幸的是,我不知道如何将列表字典映射到数据帧(感觉就像是map、isin和str.contains的混合体,但我没有任何乐趣)。我在下面包含了生成模型数据集的代码: df = pd.DataFrame(np.random.randn(10, 1), columns=list('A'

我有一个大数据框,其中包含一个
'Description'

我已经编译了一个相当大的列表字典,其中键基本上是类别,项目是描述列中包含的可能(子)字符串的列表。 我想使用字典根据这个描述对数据框中的每个条目进行分类。。。不幸的是,我不知道如何将列表字典映射到数据帧(感觉就像是
map
isin
str.contains
的混合体,但我没有任何乐趣)。我在下面包含了生成模型数据集的代码:

df = pd.DataFrame(np.random.randn(10, 1), columns=list('A'))

df['Description'] = ['White Ford Escort', 'Irish Draft Horse', 'Springer \
spaniel (dog)', 'Green Vauxhall Corsa', 'White Van', 'Labrador dog',\
'Black horse' ,'Blue Van','Red Vauxhall Corsa','Bear']
理想情况下,该模型数据集将以某种方式映射到以下字典:

dict = {'Car':['Ford Escort','Vauxhall Corsa','Van'],
        'Animal':['Dog','Horse']}
要在dataframe中生成新列,结果如下:

|   | A                    | Description            | Type   |
|---|----------------------|------------------------|--------|
| 0 | -1.4120290137842615  | White Ford Escort      | Car    |
| 1 | -0.3141036399049358  | Irish Draft Horse      | Animal |
| 2 | 0.49374344901643896  | Springer spaniel (dog) | Animal |
| 3 | 0.013654965767323723 | Green Vauxhall Corsa   | Car    |
| 4 | -0.18271952280002862 | White Van              | Car    |
| 5 | 0.9519081000007026   | Labrador dog           | Animal |
| 6 | 0.403258571154998    | Black horse            | Animal |
| 7 | -0.8647792960494813  | Blue Van               | Car    |
| 8 | -0.12429427259820519 | Red Vauxhall Corsa     | Car    |
| 9 | 0.7695980616520571   | Bear                   | -      |
这里的数字显然是不相关的,但是数据帧中还有其他列,我想让它反映出来。 我很乐意使用正则表达式,或者将字典更改为数据帧并进行连接(我考虑过多条路由)

这感觉和最近的一次类似,但不一样,答案肯定对我没有帮助

对不起,如果我在某个地方做了傻事,这真的很简单——感觉应该是这样,但我错过了一些东西

谢谢

  • 首先考虑一下,同时使所有内容都小写

  • 然后每行将描述拆分为单词,并使其小写

    • e、 例如,“斯普林格猎犬(狗)”->[“斯普林格猎犬”、“斯宾格猎犬”、“斯宾格猎犬”(“,”狗“,”)]
  • 对于(2)中的每个小写单词,在(1)中的倒排字典中查找;使用apply

  • 您可以使用库来解决此问题。确保通过
    pip安装fuzzyfuzzy安装它

    from fuzzywuzzy import process
    
    df = pd.DataFrame(np.random.randn(10, 1), columns=list('A'))
    
    df['Description'] = ['White Ford Escort', 'Irish Draft Horse', 'Springer \
    spaniel (dog)', 'Green Vauxhall Corsa', 'White Van', 'Labrador dog',\
    'Black horse' ,'Blue Van','Red Vauxhall Corsa','Bear']
    
    d = {'Car':['Ford Escort','Vauxhall Corsa','Van'],
        'Animal':['Dog','Horse']}
    


    谢谢@dyz-这与我目前的计划非常相似(我不知道dict反转,谢谢),但这仍然让人感觉有点太多步骤了-非常感谢FuzzyWzzy的介绍。预计会有一些边缘情况,但这是非常简单和有效的-已经实现了它,而且很快,所以这是一个胜利。Thanks@BAC83欢迎光临。我很高兴能帮上忙。:)
    # Construct a dataframe from the dictionary
    df1 = pd.DataFrame([*d.values()], index=d.keys()).T.melt().dropna()
    
    # Get relevant matches using the library.
    m = df.Description.apply(lambda x: process.extract(x, df1.value)[0])
    
    # concat the matches with original df
    df2 = pd.concat([df, m[m.apply(lambda x: x[1]>80)].apply(lambda x: x[0])], axis=1)
    
    df2.columns = [*df.columns, 'matches']
    
    # After merge it with df1
    df2 = df2.merge(df1, left_on='matches', right_on='value', how='left')
    
    # Drop columns that are not required and rename.
    df2 = df2.drop(['matches','value'],1).rename(columns={'variable':'Type'})
    
    print (df2)
    
              A             Description    Type
    0 -0.423555       White Ford Escort     Car
    1  0.294092       Irish Draft Horse  Animal
    2  1.949626  Springer spaniel (dog)  Animal
    3 -1.315937    Green Vauxhall Corsa     Car
    4 -0.250184               White Van     Car
    5  0.186645            Labrador dog  Animal
    6 -0.052433             Black horse  Animal
    7 -0.003261                Blue Van     Car
    8  0.418292      Red Vauxhall Corsa     Car
    9  0.241607                    Bear     NaN