我有一个包含'Description'
列的大型数据框。
我已经编译了一个相当大的列表字典,其中的键基本上是Category,而这些项是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']}
在数据框中生成一个新列,其结果如下:
| | 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类似,但是并不相同,当然答案也没有帮助我。
对不起,如果我在某个地方变得愚蠢,这真的很简单-确实应该,但是我缺少了一些东西。
谢谢
答案 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)
首先考虑inverting your dictionary,同时使所有内容都变为小写
然后在每一行中,将Description分解为单词并将其变为小写
对于(2)中的每个小写单词,在(1)中的反向字典中查找;使用Apply