python 追加模式下的Pandas到csv方法, Dataframe 具有不同的列

krcsximq  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(159)

我有一个非常大量的csv文件,我需要合并成一个单一的。由于内存限制,我不能创建一个列表并在以后进行连接,即使我有64GB的RAM。
为了避免将所有内容保存到内存中,我使用以下命令将数据流式传输到文件中:

entidad_csv = folder_entidad / f"{entidad.name.lower()}.csv"
for f in tqdm(files):
    df = descomprime(f)
    df.to_csv(entidad_csv, index=False, mode="a", header=not entidad_csv.exists())

但是,当某个文件中缺少一列时,我遇到了问题,因为它按原样追加了行。我不知道之前的手,其中列是目前在每个文件,所以我需要合并的文件有每一列。
先谢谢你了

watbbzwu

watbbzwu1#

您可以尝试根据读取的文件创建一个列列表,并使其成为一个仅带头的空白数据框,然后使用空白数据框与新的csv文件连接。它将创建一个新的dataframe,其中包含文件中的所有列。

zsohkypk

zsohkypk2#

IIUC,您可以使用以下逻辑:

output_file = Path("output_folder") / "merged.csv"

for file_path in tqdm(Path("input_files").glob("*.csv")):
    df = pd.read_csv(file_path)
    if not output_file.exists():
        df.to_csv(output_file, index=False) # header=True
    else:
        with open(output_file, "r") as file:
            old_header = file.readline().strip()
        if old_header:
            new_header = pd.Index(old_header.split(",")).union(df.columns, sort=False)
            #https://stackoverflow.com/a/48734140/16120011 © Stephen Rauch
            insert_line_front(output_file, new_header.str.cat(sep=","))
            df.reindex(new_header, axis=1).to_csv(
                output_file, index=False, header=False, mode="a"
            )

测试/输出:
file1.csv

col1
foo
bar
qux

file2.csv

col3,col4
uu,3
ww,4

file3.csv

col5,col2,col1
ii,5,baz
jj,6,qux

merged.csv(* 以表格形式 *):
| col1| col3| col4| col5| col2|
| - -----|- -----|- -----|- -----|- -----|
| 福|||||
| 酒吧|||||
| qux|||||
| | 乌|3.0|||
| | WW| 4.0|||
| 巴兹|||ii| 5.0|
| qux|||jj| 6.0|

  • 树视图:*
input_files
┣━━ file1.csv
┣━━ file1.csv
┗━━ file3.csv
output_folder
┗━━ merged.csv

相关问题