2017-04-03 9 views
1

creating an empty dataframe and populating rows laterとは異なり、連結する必要のあるデータフレームが多数あります。空のDataFrameを初期化して行を追加する

のみ2つのデータフレームがあった場合、私はこれを行うことができます。

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数百万を持っている想像してみてください。

しかしときに、私は空のデータフレームを初期化しようとした後、ループを介して新たなデータフレームを追加:

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を返します@DSMコメントから

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

ありがとうございます。 DB =( – alvas

答えて

1

df.concat()は特にきれいなCSVをするために、おそらく行く方法です。 あなたのCSVが汚れていると思われる場合や、ファイル間にタイプが混在するread_csv()で認識される可能性がある場合は、各データフレームを明示的に作成することをお勧めします。

最初のファイルのデータフレームを初期化し、後続の各ファイルを最初のファイルに基づいて空のデータフレームで開始することができます。

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

は、これはデータフレームdf1が、データなしの構造をとり、df2を作成します。列にデータ型を強制する場合は、構造体がコピーされる前に、データ型を作成するときにdf1にすることができます。

more details

0

、これは動作します:データフレームの配列を超える

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)'にならないような 'pd.commit()'があるまでは何もしないだろうと思っていたでしょうか? – philshem

+0

いいえ、連結されています – alvas

+3

この行は 'dfs(df)'です.dfsは配列であり、関数ではありません。 – philshem

関連する問題