【问题标题】:Initializing an empty DataFrame and appending rows初始化一个空的 DataFrame 并追加行
【发布时间】:2017-08-27 19:15:19
【问题描述】:

creating an empty dataframe and populating rows later 不同,我有许多需要连接的数据帧。

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

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 对象时,我都有数百万个 df 需要附加/连接。

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

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)

这将返回一个空的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)

【问题讨论】:

  • 您是不是因为 DataFrame.append 没有就地发生(与 list.append 不同)而被绊倒?如果是这样,我敢肯定,这是一个骗局。 [而且你真的不想使用 append,你想先阅读所有内容并连接 - append 会非常慢。]
  • 谢谢@DSM,有点。我本以为,直到有某种 pd.commit() 像 DB =(

标签: python pandas dataframe append concat


【解决方案1】:

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

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

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

这需要数据帧df1的结构但没有数据,并创建df2。如果你想在列上强制数据类型,那么你可以在创建它时,在复制它的结构之前对df1进行。

more details

【讨论】:

    【解决方案2】:

    来自@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)
    

    【讨论】:

    • 不应该是dfs.append(df)吗?
    • 不。它是连续的。
    • 这一行:dfs(df)。 dfs 是一个数组,而不是一个函数。
    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    相关资源
    最近更新 更多