使用pd.concat替代df.append时出现TypeError的解决办法咨询
解决Pandas中pd.concat的TypeError问题
问题背景
原本想用df.append()给DataFrame新增行,结果收到弃用警告:
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
改用pd.concat()后又碰到这个报错:
TypeError: cannot concatenate object of type '<class 'str'>'; only Series and DataFrame objs are valid.
出错的代码如下:
df = pd.DataFrame(columns=['locale', 'description']) for text in texts: df = pd.concat( dict( locale=text.locale, description=text.description ), ignore_index=True )
错误原因
pd.concat()要求传入的是Series或DataFrame对象的序列,但你直接传了普通字典,而且每次循环都把df直接替换成concat的结果,完全没和原DataFrame做合并操作,自然触发类型错误。
可行解决方案
方案1:循环中创建临时DataFrame/Series,逐次合并
每次循环把当前text的数据转成单行DataFrame,再和原df合并:
import pandas as pd df = pd.DataFrame(columns=['locale', 'description']) for text in texts: # 把当前text的数据转成单行DataFrame temp_df = pd.DataFrame({ 'locale': [text.locale], 'description': [text.description] }) # 将原df和临时df放在列表中传给concat,完成合并 df = pd.concat([df, temp_df], ignore_index=True)
也可以用Series实现:
import pandas as pd df = pd.DataFrame(columns=['locale', 'description']) for text in texts: temp_series = pd.Series({ 'locale': text.locale, 'description': text.description }) # 将Series转成单行DataFrame后合并 df = pd.concat([df, temp_series.to_frame().T], ignore_index=True)
方案2:先收集所有数据,最后一次性合并(推荐)
循环里只把数据存入列表,最后再统一生成DataFrame,数据量大时效率远高于逐次合并:
import pandas as pd data_list = [] for text in texts: data_list.append({ 'locale': text.locale, 'description': text.description }) # 一次性生成目标DataFrame df = pd.DataFrame(data_list, columns=['locale', 'description'])
内容的提问来源于stack exchange,提问作者ksykko
相关产品推荐
相关产品推荐

