Pandas替换df.append为pd.concat时遇列表类型错误,求解决方法
解决Pandas append弃用警告及concat报错问题
问题原因
你遇到的报错是因为pd.concat()仅接受Series或DataFrame对象的序列作为参数,而你修改后的代码里tmp列表存储的是普通字符串列表,不符合要求。另外,原代码用df.append()被警告是因为该方法已被弃用,官方推荐使用pd.concat()或一次性构建DataFrame的方式。
最优重写方案(效率最高)
不要在循环中拼接DataFrame,而是先收集所有行数据为字典列表,最后一次性生成DataFrame,这是Pandas官方推荐的高效写法:
# 初始化空列表存储每行数据 rows = [] with response as r: items = r.html.find('item', first=False) for item in items: title = item.find('title', first=True).text link = item.find('guid', first=True).text # 以字典形式存储每行的键值对 rows.append({'title': title, 'link': link}) # 一次性将列表转为DataFrame,列名可选(字典键已对应列名) df = pd.DataFrame(rows, columns=['title', 'link'])
若坚持使用pd.concat的写法
如果一定要用pd.concat,需要确保列表中的每个元素都是DataFrame或Series对象:
df_fragments = [] with response as r: items = r.html.find('item', first=False) for item in items: title = item.find('title', first=True).text link = item.find('guid', first=True).text # 将单条数据转为小型DataFrame fragment = pd.DataFrame({'title': [title], 'link': [link]}) df_fragments.append(fragment) # 拼接所有小型DataFrame,重置索引 df = pd.concat(df_fragments, ignore_index=True)
说明
第一种方案的效率远高于循环拼接,因为Pandas的DataFrame是基于列的存储结构,频繁修改DataFrame会产生大量性能开销,而先收集数据再一次性构建能避免这个问题。
内容的提问来源于stack exchange,提问作者rafaelHTML
相关产品推荐
相关产品推荐

