在Pandas itertuples()中,字符串“class”在namedtuple中被转换为下划线(“_1”)

mcdcgff0  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(110)

我试图做一些数据清理,并使用pandas 'itertuples'函数来生成命名元组以存储在 Dataframe 中。然而,当我使用itertuples时,名为'class'的列在命名元组中存储为'_1',而所有其他列名都正确转换。例如,'subclass'列正确转换为命名元组中的'subclass'。
一行代码和输出如下:

ipcs.rename(columns={'ipc_section':'section',
                  'ipc_class':'class',
                  'ipc_subclass':'subclass',
                  'ipc_main_group':'group',
                  'ipc_subgroup':'subgroup',
                  'ipc_sequence':'order'}, inplace=True)

[item for item in 
ipcs[['section','class', 'subclass', 'group', 'subgroup', 'order']]
.itertuples(index=False,name='IPC')]
Out[45]: 
[IPC(section='A', _1='61', subclass='F', group='9', subgroup='00', order='0')]

字符串
这是怎么回事?我假设这与Python中的关键字class有关。有什么方法可以解决这个问题吗?

lx0bsm1f

lx0bsm1f1#

在namedtuples和itertuples的文档中找到了答案。
从namedtuples文档中,我们可以找到以下内容。
完整的namedtuple函数是:

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

字符串
文件中说:“如果 rename 为true,则无效字段名将自动替换为位置名称。例如,”abc“,”“def”,“”ghi“,”“abc”]将转换为“”abc“,”"_1“,”“ghi”,“”_3“],从而消除关键字def和重复字段名abc。”
在Pandas itertuples 函数的文档中,我们可以看到以下内容:

if name is not None and len(self.columns) + index < 256:
            itertuple = collections.namedtuple(name, fields, rename=True)
            return map(itertuple._make, zip(*arrays))


因此,如果我们为元组指定一个名称(因此使其成为一个命名元组而不是普通元组),我们会触发此函数,Pandas函数将 rename 参数指定为True,因此它会自动将无效字段名称'class'转换为位置名称。
请注意,这与@chepner对这个问题的评论略有不同。具体来说,可以使用“class”作为列名(将'ipc_class'设置为'class'作为列名确实有效)但是itertuples函数将 rename 参数设置为True,因此当列名传递给itertuples时,字段名称将更改为位置名称。如果 rename 设置为False,则 * namedtuple* 函数会抛出错误。

o2rvlv0m

o2rvlv0m2#

只需更改columns属性中的名称,以避免与Python保留关键字冲突。

ipcs.rename(columns={'ipc_section':'section',
                  'ipc_class':'class_',  # class_, not class
                  'ipc_subclass':'subclass',
                  'ipc_main_group':'group',
                  'ipc_subgroup':'subgroup',
                  'ipc_sequence':'order'}, inplace=True)

字符串

相关问题