将一个pandas数据帧列表连接在一起

Whi*_*ard 104 python concat dataframe pandas

我有一个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)
Run Code Online (Sandbox Code Playgroud)

这将返回数据帧列表

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408
Run Code Online (Sandbox Code Playgroud)

这是一些示例数据

# 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]
Run Code Online (Sandbox Code Playgroud)

我想结合d1,d2d3成一个数据帧的大熊猫.或者,使用该chunksize选项时将大型表直接读入数据帧的方法将非常有用.

Dee*_*ace 190

鉴于所有数据帧都具有相同的列,您可以简单地使用concat它们:

import pandas as pd
df = pd.concat(list_of_dataframes)
Run Code Online (Sandbox Code Playgroud)

  • 我想,即使某些 `data.frame` 没有相同的列,那么在新版本的 `pandas` 中也会插入 `NaN` 而不会抛出错误 (3认同)
  • 如果您想添加列,请记住添加 axis=1 参数 (2认同)

mey*_*son 7

如果数据帧不是都具有相同的列,请尝试以下操作:

df = pd.DataFrame.from_dict(map(dict,df_list))
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3.6.5/Pandas v0.23.0上,此解决方案对我不起作用.它的错误与`TypeError:data参数不能是迭代器`.首先转换为`list`(模仿Python 2.7)也会产生意想不到的结果. (4认同)

Jay*_*ong 6

你也可以用函数式编程来做到这一点:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)
Run Code Online (Sandbox Code Playgroud)

  • `from functools import reduce` 来使用 `reduce` (2认同)
  • 不建议对多个 DataFrame 进行成对合并,它根本没有效率。请参阅“pd.concat”或“join”,两者都接受帧列表并默认在索引上连接。 (2认同)

rms*_*wrp 5

只是添加更多细节:

例子:

list1 = [df1, df2, df3]

import pandas as pd
Run Code Online (Sandbox Code Playgroud)