Pandas FutureWarning求助:列表类传入.loc或[]警告及reindex用法疑问
解决Pandas中append()触发的FutureWarning问题
这个警告的根源很明确:你用append()添加的字典里,缺少了原DataFrame中的B列。Pandas现在只是提前预警,未来版本里这种缺少标签的操作会直接抛出KeyError,而ignore_index参数管的是索引重置,和列的缺失完全没关系,所以不管怎么调它都没用。
另外要提醒一句:Pandas 2.0及以后的版本已经彻底移除了append()方法,所以更建议你改用更规范的方式来合并数据,这里给你几种可行的方案:
方案一:用reindex()对齐列后合并(对应你问的reindex用法)
先把要添加的单行转成DataFrame,再用reindex()对齐原数据的列(缺失的列会自动填充NaN),最后用concat()替代append()完成合并:
import io import pandas as pd data = io.StringIO('''A,B,M AM,1, AMC,2, ''') df = pd.read_csv(data) r=['CAR'] s=['CAR_M'] for i,j in zip(r,s): # 构造单行DataFrame new_row = pd.DataFrame({'A':[i], 'M':[j]}) # 对齐原DataFrame的所有列 new_row_aligned = new_row.reindex(df.columns, axis=1) # 合并数据 df = pd.concat([df, new_row_aligned], ignore_index=True)
方案二:直接补全所有列的内容
如果清楚原DataFrame的所有列,在构造字典时直接给缺失的列赋值NaN(或者pd.NA,推荐后者,更符合Pandas的缺失值规范),这样即使暂时用append()也不会触发警告:
for i,j in zip(r,s): df = df.append([{'A':i, 'B':pd.NA, 'M':j}], ignore_index=True)
不过还是更推荐方案一,毕竟append()已经被弃用了。
方案三:批量添加更高效
如果要添加的行不止一条,建议先把所有新行整理成列表,转成DataFrame后一次性合并,比循环里逐行合并效率高得多:
# 批量构造新行的列表 new_rows = [{'A':i, 'M':j} for i,j in zip(r,s)] # 转成DataFrame并对齐列 new_df = pd.DataFrame(new_rows).reindex(df.columns, axis=1) # 一次性合并 df = pd.concat([df, new_df], ignore_index=True)
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

