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、 例如,“斯普林格猎犬(狗)”->[“斯普林格猎犬”、“斯宾格猎犬”、“斯宾格猎犬”(“,”狗“,”)]
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