Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字典值映射到具有列表值的数据帧列_Python_Pandas_Dataframe_Dictionary - Fatal编程技术网

Python 如何将字典值映射到具有列表值的数据帧列

Python 如何将字典值映射到具有列表值的数据帧列,python,pandas,dataframe,dictionary,Python,Pandas,Dataframe,Dictionary,我有一个数据框,如下所示: df = pd.DataFrame( {'title':['a1','a2','a3','a4','a5'], 'genre_name':[ ['family', 'animation'], ['action', 'family', 'comedy'], ['family', 'comedy'], ['horror','action'], ['family',

我有一个数据框,如下所示:

df = pd.DataFrame(
    {'title':['a1','a2','a3','a4','a5'],
     'genre_name':[
         ['family', 'animation'],
         ['action', 'family', 'comedy'],
         ['family', 'comedy'],
         ['horror','action'],
         ['family', 'animation','comedy']]}
)

df
      title    genre_name
0      a1     ['family', 'animation']
1      a2     ['action', 'family', 'comedy']
2      a3     ['family', 'comedy']
3      a4     ['horror','action]
4      a5     ['family', 'animation','comedy']
我的字典如下:

dict={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}
我想创建一个名为“流派ID”的新列,它将所有流派名称映射到字典“dict”中的键

所需的df为:

df
          title    genre_name                       genre_ids
    0      a1     ['family', 'animation']           [1,2]
    1      a2     ['action', 'family', 'comedy']    [3,1,4]
    2      a3     ['family', 'comedy']              [1,4]
    3      a4     ['horror','action]                [5,3]
    4      a5     ['family', 'animation','comedy']  [1,2,4]

如何实现这一点?

将dictionary name从
dict
更改为另一个变量,因为内置(python代码字),然后在列表综合中用值和映射值交换键:

d={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}

d1 = {v:k for k, v in d.items()}
df['genre_ids'] = df['genre_name'].apply(lambda x: [d1.get(y) for y in x])
#alternative
#df['genre_ids'] = [[d1.get(y) for y in x] for x in df['genre_name']]
print (df)
  title                   genre_name  genre_ids
0    a1          [family, animation]     [1, 2]
1    a2     [action, family, comedy]  [3, 1, 4]
2    a3             [family, comedy]     [1, 4]
3    a4             [horror, action]     [5, 3]
4    a5  [family, animation, comedy]  [1, 2, 4]
编辑:您还可以指定如果不匹配会发生什么,这里为第一个列表添加了
crime

df = pd.DataFrame({'title':['a1','a2','a3','a4','a5'], 
                   'genre_name':[['crime', 'animation'],['action', 'family', 'comedy'],
                                 ['family', 'comedy'],['horror','action'],
                                 ['family', 'animation','comedy']]})

d={'1':'family','2':'animation','3':'action','4':'comedy','5':'horror'}


d1 = {v:k for k, v in d.items()}
#no matched values repalced to None
df['genre_ids0'] = df['genre_name'].apply(lambda x: [d1.get(y) for y in x])
#no match replaced to default value
df['genre_ids1'] = df['genre_name'].apply(lambda x: [d1.get(y, 0) for y in x])
#no match is removed
df['genre_ids2'] = df['genre_name'].apply(lambda x: [d1[y] for y in x if y in d1])
print (df)
  title                   genre_name genre_ids0 genre_ids1 genre_ids2
0    a1           [crime, animation]  [None, 2]     [0, 2]        [2]
1    a2     [action, family, comedy]  [3, 1, 4]  [3, 1, 4]  [3, 1, 4]
2    a3             [family, comedy]     [1, 4]     [1, 4]     [1, 4]
3    a4             [horror, action]     [5, 3]     [5, 3]     [5, 3]
4    a5  [family, animation, comedy]  [1, 2, 4]  [1, 2, 4]  [1, 2, 4]

创建
d1
?@BearBrown-交换键->值有什么用