2017-04-03 124 views
1

creating an empty dataframe and populating rows later不同,我有许多需要连接的数据帧。初始化一个空的DataFrame并添加行

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

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) 

想象我有几百万的df需要追加/每次我读了一个新的文件转换成数据帧对象时串联。

但是,当我试图初始化一个空数据帧,然后通过循环将新dataframes:

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) 
+1

你刚刚绊倒了,因为DataFrame.append不会发生就地(不像list.append)?如果是这样,我肯定这是一个重复的事情。 [你真的不想使用追加,你想先读取所有内容并连接 - 追加会非常慢。] – DSM

+0

谢谢@DSM,有点。我会想,append不会做任何事情,直到有某种'pd.commit()'就像一个DB =( – alvas

回答

1

df.concat()在dataframes的数组可能是要走,尤其是清洁的CSV的方式。 但是如果您怀疑您的CSV文件很脏或可能被文件之间的混合类型read_csv()识别,您可能需要在循环中明确创建每个数据帧。

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

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

这需要数据帧df1但没有数据的结构,创造df2。如果您想要在列上强制数据类型,那么在创建结构之前,可以将它创建为df1

more details

0

从@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) 
+0

不应该是'dfs.append(df)'? – philshem

+0

没有。它是concat。 – alvas

+3

这一行:'dfs(df)'。dfs是一个数组,而不是一个函数。 – philshem