【问题标题】:Map dictionary values in Pandas在 Pandas 中映射字典值
【发布时间】:2018-02-24 20:37:29
【问题描述】:

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

 var1
a 1 
a 1 
b 2  
b 3 
c 3 
d 5 

还有一本字典:

dict_cat = {
'x' = ['a', 'b', 'c'],
'y' = 'd' }

我想创建一个名为 cat 的新列,其中取决于 var1 值,它采用 dict 键值:

 var1 cat
a 1 x 
a 1 x
b 2 x
b 3 x
c 3 x
d 5 y

我尝试使用 df['cat'] = df['var1'].map(dict_cat) 将变量的字典 map 输入:但由于值在列表中,Python 无法识别这些值,我只得到 NaN 值。有一种方法可以使用map 来做到这一点,或者我应该创建一个函数来遍历行检查var1 是否是in 字典列表?

谢谢!

【问题讨论】:

  • 你需要解开你的字典,可以这么说,并反转映射。然后您应该能够使用 df.index.map(mapping.get)。

标签: python pandas


【解决方案1】:

您需要将带有值的键交换为新的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

如果第一列是索引可以使用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

或者:

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

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2020-09-01
    • 2021-12-27
    • 1970-01-01
    • 2021-08-02
    • 2021-10-14
    • 2021-08-04
    • 2012-08-27
    相关资源
    最近更新 更多