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
相关产品推荐
相关产品推荐

