映射熊猫中的字典值

top*_*cat 2 python pandas

我有一个数据框(df),其中包含以下内容:

 var1
a 1 
a 1 
b 2  
b 3 
c 3 
d 5 
Run Code Online (Sandbox Code Playgroud)

和字典:

dict_cat = {
'x' = ['a', 'b', 'c'],
'y' = 'd' }
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列cat,该列根据var1值使用dict键值:

 var1 cat
a 1 x 
a 1 x
b 2 x
b 3 x
c 3 x
d 5 y
Run Code Online (Sandbox Code Playgroud)

我尝试map使用:将变量指定为dict df['cat'] = df['var1'].map(dict_cat),但是由于值在列表内,因此Python无法识别值,而我只能获取NaN值。有一种使用的方法map,还是应该创建一个对行进行迭代的函数,以检查是否var1in字典列表?

谢谢!

jez*_*ael 7

您需要将交换键的值更改为new dict,然后使用map

print (df)
  var1  var2
0    a     1
1    a     1
2    b     2
3    b     3
4    c     3
5    d     5
dict_cat = {'x' : ['a', 'b', 'c'],'y' : 'd' }

d = {k: oldk for oldk, oldv in dict_cat.items() for k in oldv}
print (d)
{'a': 'x', 'b': 'x', 'c': 'x', 'd': 'y'}

df['cat'] = df['var1'].map(d)
print (df)
  var1  var2 cat
0    a     1   x
1    a     1   x
2    b     2   x
3    b     3   x
4    c     3   x
5    d     5   y
Run Code Online (Sandbox Code Playgroud)

如果第一列是可能的索引,请使用rename或转换index to_series,然后使用map

print (df)
   var1
a     1
a     1
b     2
b     3
c     3
d     5

dict_cat = {'x' : ['a', 'b', 'c'],'y' : 'd' }
d = {k: oldk for oldk, oldv in dict_cat.items() for k in oldv}

df['cat'] = df.rename(d).index
Run Code Online (Sandbox Code Playgroud)

要么:

df['cat'] = df.index.to_series().map(d)
print (df)
   var1 cat
a     1   x
a     1   x
b     2   x
b     3   x
c     3   x
d     5   y
Run Code Online (Sandbox Code Playgroud)