2017-04-03 125 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