Pandas合并DataFrame报错'NoneType'对象无assign属性如何解决
错误诱因
- 核心错误来自
drop方法的inplace=True参数:当该参数设为True时,drop会直接修改原DataFrame对象,返回值为None。你在代码中将返回的None重新赋值给了df变量,后续调用df.assign()时自然会触发NoneType没有assign属性的报错。 - 你代码中还存在另一个隐性问题:
pd.DataFrame.append()属于非原地操作,你当前写法下的df_total.append(df,ignore_index=True)不会修改原有df_total对象,最后得到的总表会是空的;同时append方法在Pandas 2.0及以上版本已经被官方弃用,性能也远低于批量合并的方案。
修复方案
你可以选择两种方式修改drop相关代码,同时调整合并逻辑:
方案1:保留inplace=True,去掉多余赋值
date_num = 0 # 先创建列表存储所有单表,最后一次性合并效率更高 df_list = [] for i in dataframe_csv: df = pd.read_csv(i) # 去掉赋值,直接在原df上执行删除 df.drop(index=df.index[0], axis=0, inplace=True) df = df.assign(Date = date_list[date_num]) date_num += 1 df_list.append(df) # 一次性合并所有表 df_total = pd.concat(df_list, ignore_index=True)
方案2:去掉inplace=True,接收返回的新DataFrame
date_num = 0 df_list = [] for i in dataframe_csv: df = pd.read_csv(i) # 不设置inplace,直接接收删除后的新df df = df.drop(index=df.index[0], axis=0) df = df.assign(Date = date_list[date_num]) date_num += 1 df_list.append(df) df_total = pd.concat(df_list, ignore_index=True)
两种方案效果一致,相比你原有循环中反复append总表的写法,先存到列表最后一次性合并的性能提升会非常明显,尤其是数据量较大时。
内容的提问来源于stack exchange,提问作者Chriz
相关产品推荐
相关产品推荐

