Python3中pandas DataFrame拼接出NaN且head方法失效问题
问题原因及修复方案
两个异常的根因
- 原df的Name列全为NaN:你在读取csv时通过
index_col='Name'参数将Name列设置为了DataFrame的行索引,此时原df中已经不存在作为普通列的Name字段。你新建的new_row是把Name作为普通列传入的,pd.concat做拼接时会按列名对齐,原df没有对应Name普通列的位置就会被填充为NaN;后续你调用reset_index(drop=True)时直接丢弃了原df的行索引(也就是原本存储在索引位置的球员姓名),最终导致除了你新加的第一行,其余行的Name列全是空值。 - 打印输出全部459行:
df_new.head(5)的作用是返回一个只包含前5行的新DataFrame对象,你既没有将这个返回结果赋值给变量,也没有对它执行打印操作,最后执行的print(df_new)是直接打印完整的df_new对象,自然会输出全部行。
修正后的可运行代码
两种改法任选其一即可:
改法1:读取文件时不将Name设为索引(最贴合常规教程写法)
import pandas as pd import numpy as np # 读取时不指定index_col,让Name作为普通列存在 df = pd.read_csv('nba.csv') df.head(10) new_row = pd.DataFrame({'Name':'Geeks', 'Team':'Boston', 'Number':3, 'Position':'PG', 'Age':33, 'Height':'6-2', 'Weight':189, 'College':'MIT', 'Salary':99999}, index =[0]) df_new = pd.concat([new_row, df]).reset_index(drop = True) # 直接打印head的返回结果 print(df_new.head(5))
改法2:保留原读取逻辑,调整新行构造方式
如果你确实需要在读取时把Name设为索引,可以按下面的方式写,拼接后再把索引转回普通列:
import pandas as pd import numpy as np df = pd.read_csv('nba.csv', index_col ='Name') df.head(10) # 新行不传入Name列,把Name值作为索引传入 new_row = pd.DataFrame({'Team':'Boston', 'Number':3, 'Position':'PG', 'Age':33, 'Height':'6-2', 'Weight':189, 'College':'MIT', 'Salary':99999}, index =['Geeks']) # 拼接后重置索引,把原来的Name索引转为普通列 df_new = pd.concat([new_row, df]).reset_index().rename(columns={'index':'Name'}) print(df_new.head(5))
运行修正后的代码,即可看到Name列正常显示所有值,且控制台仅打印前5行内容。
内容的提问来源于stack exchange,提问作者Shooting Stars
相关产品推荐
相关产品推荐

