初始化一个空的 DataFrame 并附加行

Initializing an empty DataFrame and appending rows

不同,我有很多数据帧需要连接起来。

如果只有两个数据框,我可以这样做:

df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))

df1.append(df2, ignore_index=True)

想象一下,每次我将新文件读入 DataFrame object 时,我有数百万 df 需要 appended/concatenated。

但是当我尝试初始化一个空数据帧然后通过循环添加新数据帧时:

import pandas as pd
alldf = pd.DataFrame(, columns=list('AB'))
for filename in os.listdir(indir):
    df = pd.read_csv(indir+filename, delimiter=' ')
    alldf.append(df, ignore_index=True)

这将 return 一个只有 header 行的空 alldf,例如

alldf = pd.DataFrame(columns=list('AB'))
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
for df in [df1, df2]:
    alldf.append(df, ignore_index=True)

来自@DSM 的评论,这有效:

import pandas as pd
dfs = []
for filename in os.listdir(indir):
    df = pd.read_csv(indir+filename, delimiter=' ')
    dfs(df)

alldf = pd.concat(dfs)

df.concat() 遍历一组数据帧可能是可行的方法,尤其是对于干净的 CSV。 但是 如果您怀疑您的 CSV 文件不干净或者可能被 read_csv() 识别为文件之间的混合类型,您可能需要在循环中明确创建每个数据帧。

您可以为第一个文件初始化一个数据帧,然后每个后续文件都以第一个文件为基础的空数据帧开始。

df2 = pd.DataFrame(data=None, columns=df1.columns,index=df1.index)

这采用数据帧 df1 的结构但没有数据,并创建 df2。如果你想在列上强制数据类型,那么你可以在创建它时 df1 在复制它的结构之前做到这一点。

more details