我使用pandas 0.20.1和Python 3.6
首先请检查我的例子:
假设我有一个名为 a 的数据框:
up down
0 a high
1 a low
2 b low
3 c high
每列都有一些字符串。我想要做的是将这些字符串转换为数字,并存储数据帧中每列的映射。 那就是:
up down
0 0 0
1 0 1
2 1 1
3 2 0
并将映射存储在两个以 column_name +' _code' 格式命名的数据框中。在我的示例中,它们是 up_code 和 down_code :
up up_id
0 a 0
1 b 1
2 c 2
down down_id
0 high 0
1 low 1
我试过的是:
cols = ['up', 'down']
for col in cols:
exec("%(k)s_code = pd.DataFrame({%(k)s:a[col].unique(), %(k)s_id:range(len(a[col].unique()))})" % {'k':col})
我预计这将创建存储映射的数据帧,但它引发了一个名称错误:
Traceback (most recent call last):
File "<ipython-input-81-7fc8a22fc7f1>", line 2, in <module>
exec("%(k)s_code = pd.DataFrame({%(k)s:a[col].unique(), %(k)s_id:range(len(a[col].unique()))})" % {'k':col})
File "<string>", line 1, in <module>
NameError: name 'up' is not defined
我在这里做错了什么?或者有更简单的方法来实现它吗?
答案 0 :(得分:1)
Dict的键必须是分配给它的字符串,数字或变量。在您使用exec的情况下,创建了方法变量,因此将代码(k)s
和(k)s_id
更改为'(k)s'
和'(k)s_id'
。
cols = ['up', 'down']
for col in cols:
exec("%(k)s_code = pd.DataFrame({'%(k)s':a[col].unique(), '%(k)s_id':range(len(a[col].unique()))})" % {'k':col})