来自不同列表的同一类别

时间:2019-03-04 15:29:00

标签: python pandas dictionary

我最初有一个类似的数据框

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行,因此无法列举所有可能的情况。

1 个答案:

答案 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]