Python 在Pandas itertuples()中,字符串';类别';转换为'_1';以命名的倍数

Python 在Pandas itertuples()中,字符串';类别';转换为'_1';以命名的倍数,python,pandas,Python,Pandas,我正在尝试进行一些数据清理,并使用pandas'itertuples'函数生成命名元组以存储在数据帧中。但是,当我使用itertuples时,名为“class”的列在命名元组中存储为“_1”,而所有其他列名转换正确。例如,“subclass”列正确地转换为命名元组中的“subclass” 一行代码和输出如下: ipcs.rename(列={'ipc_section':'section', “ipc_类”:“类”, “ipc_子类”:“子类”, “ipc_主_组”:“组”, “ipc_子组”:“子

我正在尝试进行一些数据清理,并使用pandas'itertuples'函数生成命名元组以存储在数据帧中。但是,当我使用itertuples时,名为“class”的列在命名元组中存储为“_1”,而所有其他列名转换正确。例如,“subclass”列正确地转换为命名元组中的“subclass”

一行代码和输出如下:

ipcs.rename(列={'ipc_section':'section',
“ipc_类”:“类”,
“ipc_子类”:“子类”,
“ipc_主_组”:“组”,
“ipc_子组”:“子组”,
“ipc_序列”:“顺序”},原地=真)
[项目中的项目对项目]
ipcs[[“部分”、“类”、“子类”、“组”、“子组”、“顺序”]]
.itertuples(index=False,name='IPC')]
出[45]:
[IPC(第class='A'、_1='61',子类class='F',组class='9',子组class='00',顺序class='0')]

这是怎么回事?我认为这与“class”在Python中是一个关键字有关。有什么办法可以解决这个问题吗

只需更改
属性中的名称,以避免与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)

在namedtuples和itertuples的文档中找到了答案

从namedtuples文档中,我们可以找到以下内容

全名双倍函数是:

collections.namedtuple(typename,field\u names,*,rename=False,defaults=None,module=None)
文件规定: 如果“重命名”为true,则无效的字段名将自动替换为位置名。例如,['abc'、'def'、'ghi'、'abc']将转换为['abc'、'_1'、'ghi'、'_3'],从而消除关键字def和重复的字段名abc

在Pandas itertuples功能文档中,我们可以看到以下内容:

如果名称不是None且len(self.columns)+索引<256:
itertuple=collections.namedtuple(名称、字段、重命名=True)
返回图(itertuple.\u make,zip(*数组))
因此,如果我们为元组指定名称(因此使其成为命名元组而不是普通元组),我们将触发此函数,并且Pandas函数将rename参数指定为True,以便它自动将无效字段名“class”转换为位置名


请注意,这与@chepner对该问题的评论略有不同。具体地说,可以使用“class”作为列的名称(将“ipc_class”设置为“class”作为列名确实有效),但itertuples函数将rename参数设置为True,因此当列名传递给itertuples时,字段名将更改为位置名称。如果rename设置为False,namedtuple函数将抛出一个错误。

class
是Python中的一个关键字,因此不能用作列名。(在我看来,
与任何事物的冲突都不比
\u 1
大,但关键是必须使用其他名称。)至少,这是有文档记录的:如果列名是无效的Python标识符、重复或以下划线开头,则列名将重命名为位置名称。对于大量列(>255),将返回常规元组。“感谢您的回答。在文档中找到了更全面的描述,因此将使用该描述作为答案。