为Pandas DataFrame指定列名后按数字索引打印行报错解决
问题原因与解决方案
错误原因
手动指定列名后,DataFrame的列标签变成了你定义的字符串(如UNIX_UTC_Time),但你在data.at[x,y]中用的是数字索引y。at方法只能通过列标签定位,无法识别数字位置索引,因此抛出KeyError: 0。
修复方案
方案1:适配你的循环逻辑(用iloc替代at)
iloc是按位置索引访问的方法,不受列标签影响,能正常定位到对应单元格。调整后的代码如下:
import pandas as pd import math data = pd.read_csv(…) # 填入文件名和参数 data.columns=['UNIX_UTC_Time', 'Home_Team', …] # 完整列名 matches_number=len(data.index) def check_data_quality(): for x in range(matches_number): # 用data.shape[1]动态获取列数,避免硬编码11 for y in range(data.shape[1]): if y == 1 or y == 2: # 跳过字符串列 continue value = data.iloc[x, y] if math.isnan(value): print(f'NaN出现在行{x},整行数据:') print(data.iloc[x]) print('---') check_data_quality()
方案2:用Pandas原生方法(更高效,推荐)
Pandas内置了缺失值处理工具,无需手动循环,效率更高:
import pandas as pd data = pd.read_csv(…) data.columns=['UNIX_UTC_Time', 'Home_Team', …] # 筛选出至少包含一个NaN的行 nan_rows = data[data.isna().any(axis=1)] print('存在NaN的行:') print(nan_rows) # 如果只想检查非字符串列的NaN,可先筛选目标列 non_str_cols = data.columns.drop(['Home_Team', '你的第二个字符串列名']) nan_rows_filtered = data[data[non_str_cols].isna().any(axis=1)] print('非字符串列存在NaN的行:') print(nan_rows_filtered)
内容的提问来源于stack exchange,提问作者DVS75
相关产品推荐
相关产品推荐

