我正在尝试做一些在熊猫中应该非常简单的事情,但是似乎没什么。我正在尝试向现有的熊猫数据框添加一列,该列是基于另一个(现有)列的映射值。这是一个小测试用例:

import pandas as pd
equiv = {7001:1, 8001:2, 9001:3}
df = pd.DataFrame( {"A": [7001, 8001, 9001]} )
df["B"] = equiv(df["A"])
print(df)


我希望得到以下结果:

      A   B
0  7001   1
1  8001   2
2  9001   3


,我收到一个错误消息,告诉我Equiv不是可调用函数。公平地说,它是一个字典,但是即使将其包装在一个函数中,我仍然会感到沮丧。因此,我尝试使用似乎可以与其他操作配合使用的map函数,但也由于使用字典而无法使用它: KeyError:8001。我已经阅读了文档和以前的文章,但是还没有发现任何建议如何将字典与pandas数据框混合使用的信息。任何建议将不胜感激。

#1 楼

正确的方法是df["B"] = df["A"].map(equiv)

In [55]:

import pandas as pd
equiv = {7001:1, 8001:2, 9001:3}
df = pd.DataFrame( {"A": [7001, 8001, 9001]} )
df["B"] = df["A"].map(equiv)
print(df)
      A  B
0  7001  1
1  8001  2
2  9001  3

[3 rows x 2 columns]


考虑以下示例,它将很好地处理密钥不存在的情况:

In [56]:

import pandas as pd
equiv = {7001:1, 8001:2, 9001:3}
df = pd.DataFrame( {"A": [7001, 8001, 9001, 10000]} )
df["B"] = df["A"].map(equiv)
print(df)
       A   B
0   7001   1
1   8001   2
2   9001   3
3  10000 NaN

[4 rows x 2 columns]


评论


如果您的数据是字符串而不是int,有没有办法做到这一点?这只是给我NaN字符串。

– griffinc
17年5月11日在2:34

没关系,请在此处查看答案stackoverflow.com/questions/20250771/…

– griffinc
17年5月11日在3:20

如果您的对等字典具有列表而不是整数,该怎么办?您如何仅映射该列表的第n个元素?

–FaCoffee
19年2月12日在12:48

我总是用这种方法得到这个警告。解决办法是什么???? SettingWithCopyWarning:试图在DataFrame的切片副本上设置一个值。尝试使用.loc [row_indexer,col_indexer] = value代替。请参见文档中的警告:pandas.pydata.org/pandas-docs/stable/user_guide/…从sys.path中删除cwd之后。

–mah65
2月14日,下午2:52