我最初有一个类似的数据框
datax = {'col1' : [['apple','pear','peach'],['kiwi','pear','apple','watermelon']]}
db = pd.DataFrame(columns = ['col1'], data = datax))
“ col1”列的每一行都是一个字符串列表,并且字符串的每个元素都应该是一个类别。 我想做的是创建一个包含不同行中所有类别的类别对象,然后将分类转换应用于每行。 我设法用这种方式创建了一个包含来自不同行的所有单词的字典:
categ = []
for lst in db['col1']:
for term in lst:
if term not in categ:
categ.append(term)
categ = pd.Series(categ, dtype = 'category')
但是我认为这不是达到目标的Python方式。 此外,我不知道如何用键替换行内的字符串(也是我字典中的值)。
是否有更好的方法来提取和映射类别?
基本上,我需要做的是
>>db['col1']
[['apple','pear','peach'],
['kiwi','pear','apple','watermelon']]
我想联系的是:
>>db['col1']
[[0,1,2],
[3,1,0,4]]
请注意,由于我希望可以反转操作并重新创建原始列,因此我尝试使用字典。 我的行数多于2行,因此无法列举所有可能的情况。
答案 0 :(得分:0)
好的,因此您可以使用,解释将添加为注释:
import itertools
a=list(itertools.chain.from_iterable(db.col1)) #flatten the lists
d=dict(zip(a,pd.factorize(a)[0])) #create a dictionary mapping
#output->{'apple': 0, 'pear': 1, 'peach': 2, 'kiwi': 3, 'watermelon': 4}
#next line replaces the value of list with value of dictionary d
db.col1.apply(lambda x: [sum(int(d[k]) for k in y.split()) for y in x])
输出
0 [0, 1, 2]
1 [3, 1, 0, 4]