パンダのデータフレームのリストを連結します


129

1つのPandasデータフレームに結合したいPandasデータフレームのリストがあります。Python 2.7.10とPandas 0.16.2を使用しています

私はからデータフレームのリストを作成しました:

import pandas as pd
dfs = []
sqlall = "select * from mytable"

for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
    dfs.append(chunk)

これはデータフレームのリストを返します

type(dfs[0])
Out[6]: pandas.core.frame.DataFrame

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

ここにいくつかのサンプルデータがあります

# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., 12.]})

# list of dataframes
mydfs = [d1, d2, d3]

私は結合したいd1d2と、d31匹のパンダのデータフレームに。あるいは、このchunksizeオプションを使用するときに、大きな風のテーブルをデータフレームに直接読み取る方法が非常に役立ちます。

回答:


243

すべてのデータフレームが同じ列を持っているとすると、単純にconcatそれらを行うことができます:

import pandas as pd
df = pd.concat(list_of_dataframes)

1
それらが同じ列を持たない場合は、最初にそれらをdictにキャストしてから、from_dictを使用できます
meyerson

1
列を追加する場合は、axis = 1引数を忘れずに追加してください
ford prefect

3
data.frameNaNpandas
おそらく

7

データフレームにすべて同じ列がない場合は、以下を試してください。

df = pd.DataFrame.from_dict(map(dict,df_list))

7
このソリューションは、Python 3.6.5 / Pandas v0.23.0では動作しません。それはエラーTypeError: data argument can't be an iteratorです。list最初に変換すると(Python 2.7を模倣するため)、予期しない結果も生じます。
2018

すべてのデータフレームに同じ列がある場合、どうすればよいですか?
Thony Nadhir

6

関数型プログラミングでもそれを行うことができます:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)

2
from functools import reduce使用reduce
nishant

複数のデータフレームに対してペアワイズマージを実行することはお勧めしません。効率的ではありません。pd.concatまたはを参照してくださいjoin。どちらもフレームのリストを受け入れ、デフォルトでインデックスに結合します。
cs95

0

concat また、既存のデータフレームに対して「loc」コマンドを使用してプルされたリスト内包とうまく連携します

df = pd.read_csv('./data.csv') # ie; Dataframe pulled from csv file with a "userID" column

review_ids = ['1','2','3'] # ie; ID values to grab from DataFrame

# Gets rows in df where IDs match in the userID column and combines them 

dfa = pd.concat([df.loc[df['userID'] == x] for x in review_ids])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.