通过for循环和exec()创建一系列映射

时间:2017-08-27 11:58:10

标签: python python-3.x pandas

我使用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

我在这里做错了什么?或者有更简单的方法来实现它吗?

1 个答案:

答案 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})