为何Pandas DataFrame的append方法不生效?代码排查求助
Pandas DataFrame.append() 不生效的问题解析
嘿,我一眼就揪出问题所在啦!你对Pandas append() 方法的使用方式有误——这个方法不会直接修改原DataFrame,而是返回一个包含追加数据的全新DataFrame。你现在只是调用了result_df.append(data),但没把返回的新对象重新赋值给result_df,所以最初创建的空DataFrame自始至终都没被更新,最后输出自然是空的。
错误原因拆解
在你的循环代码里:
result_df.append(data)
这行代码确实生成了一个包含result_df原有数据+data的新DataFrame,但你没有把这个新对象存回result_df变量中,导致result_df始终是最开始创建的空DataFrame。
修正方案1:正确使用append()
只需要把append返回的新DataFrame重新赋值给result_df即可,同时建议加上ignore_index=True避免索引重复:
import glob import pandas as pd import pyarrow as pa import pyarrow.parquet as pq f_name = glob.glob('*.json') result_df = pd.DataFrame() filepath = 'proba.parquet' for f in f_name: with open(f, encoding='utf-8', mode='r') as i: data = pd.read_json(i, lines=True) # 关键:将append返回的新DataFrame赋值回result_df result_df = result_df.append(data, ignore_index=True) print(result_df) table_from_pandas = pa.Table.from_pandas(result_df) pq.write_table(table_from_pandas, filepath)
更优方案:使用pd.concat()替代append()
需要注意的是,Pandas从1.4.0版本开始已经弃用了append()方法,官方推荐用pd.concat()替代。这种方式不仅符合官方规范,还能避免循环中反复创建新DataFrame的性能损耗,尤其适合处理大量文件的场景:
import glob import pandas as pd import pyarrow as pa import pyarrow.parquet as pq f_name = glob.glob('*.json') df_list = [] # 先将所有读取的DataFrame存入列表 filepath = 'proba.parquet' for f in f_name: with open(f, encoding='utf-8', mode='r') as i: data = pd.read_json(i, lines=True) df_list.append(data) # 一次性合并所有DataFrame result_df = pd.concat(df_list, ignore_index=True) print(result_df) table_from_pandas = pa.Table.from_pandas(result_df) pq.write_table(table_from_pandas, filepath)
内容的提问来源于stack exchange,提问作者Djikii




