You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中itertuples结合columns.get_loc出现类型错误的正确写法

问题:使用pandas itertuples访问含特殊字符的列时出错

我运行以下代码时,想在value 1 ~~列值非负时打印1,却触发了TypeError: '>=' not supported between instances of 'Timestamp' and 'int'错误。原因是用itertuples(index=True)生成的row对象包含索引列,df.columns.get_loc('value 1 ~~')返回的索引对应row里的datetime列(Timestamp类型),而非目标列。我不想用row[df.columns.get_loc('value 1 ~~')+1]的写法,而且试了row.__getattribute__('value 1 ~~')也没用,请问正确语法是什么?

import pandas as pd
from datetime import datetime

# Sample data
data = {    
    'datetime': [
        datetime(2023, 11, 11, 8, 0, 0),
        datetime(2023, 11, 11, 8, 5, 0),
        datetime(2023, 11, 11, 8, 10, 0),
        datetime(2023, 11, 11, 8, 15, 0),
        datetime(2023, 11, 11, 8, 20, 0),
        datetime(2023, 11, 11, 8, 25, 0),
        datetime(2023, 11, 11, 8, 30, 0),
        datetime(2023, 11, 11, 8, 35, 0),
        datetime(2023, 11, 11, 8, 40, 0),
        datetime(2023, 11, 11, 8, 45, 0),
        datetime(2023, 11, 11, 8, 50, 0),
    ],
    'value 1 ~~': [1,  3, 1, 0, -1, 1, 0, 2, -3, 0, -3],                   
}

# Create the DataFrame
df = pd.DataFrame(data)

for row in df.itertuples(index=True):

    print(row.Index)    
    if row[df.columns.get_loc("value 1 ~~")] >= 0:
        print(1)

注:我不想使用以下写法:

if row[df.columns.get_loc("value 1 ~~")+1] >= 0:

更新2023/12/15 15:20:row.__getattribute__('value 1 ~~')也无法正常工作。


解决方案

方法1:适配自动转换后的属性名

itertuples会自动将含特殊字符的列名转换为合法Python标识符(空格、特殊符号替换为下划线),value 1 ~~会被转换为value_1__,用getattr()或直接访问属性即可:

for row in df.itertuples(index=True):
    print(row.Index)
    if getattr(row, 'value_1__') >= 0:
        # 或者直接写 row.value_1__ >= 0
        print(1)

方法2:关闭索引列

如果不需要行索引,设置itertuples(index=False),此时df.columns.get_loc返回的索引与row位置完全对应:

for row in df.itertuples(index=False):
    if row[df.columns.get_loc("value 1 ~~")] >= 0:
        print(1)

方法3:查看字段名后直接访问

可以先打印row的类型查看所有字段名,再直接访问对应属性:

# 先打印字段名确认
for row in df.itertuples(index=True):
    print(row._fields)  # 输出 ('Index', 'datetime', 'value_1__')
    break

# 之后直接访问
for row in df.itertuples(index=True):
    print(row.Index)
    if row.value_1__ >= 0:
        print(1)

内容的提问来源于stack exchange,提问作者jad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:25:03