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

时间:2018-11-27 21:21:41

标签: python pandas dictionary

我有一个包含'Description'列的大型数据框。

我已经编译了一个相当大的列表字典,其中的键基本上是Category,而这些项是description列中包含的可能(子)字符串的列表。 我想根据此描述使用字典对数据框中的每个条目进行分类...不幸的是,我无法弄清楚如何应用列表字典映射到数据框(感觉就像是某种形式的混合mapisinstr.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']}

在数据框中生成一个新列,其结果如下:

|   | 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                   | -      |

这里的数字显然无关紧要,但是数据框中还有其他列,我希望反映出来。 我很高兴使用正则表达式,或者可能将我的字典更改为数据框并进行联接(我已经考虑了多条路线)。

感觉与最近的question类似,但是并不相同,当然答案也没有帮助我。

对不起,如果我在某个地方变得愚蠢,这真的很简单-确实应该,但是我缺少了一些东西。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用fuzzywuzzy库来解决此问题。确保通过pip install fuzzywuzzy

安装
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']}

# 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

答案 1 :(得分:0)

  1. 首先考虑inverting your dictionary,同时使所有内容都变为小写

  2. 然后在每一行中,将Description分解为单词并将其变为小写

    • 例如,“史宾格犬(狗)”-> ['史宾格犬','西班牙猎狗','(','狗',')']
  3. 对于(2)中的每个小写单词,在(1)中的反向字典中查找;使用Apply