将一系列Pandas数据框连接在一起

276

我有一个 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]

我希望将 d1d2d3 合并成一个 pandas 数据帧。或者,在使用 chunksize 选项时直接读取较大表格到数据帧的方法也会非常有帮助。

6个回答

505

假设所有数据框都有相同的列,您可以简单地使用concat函数将它们合并:

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

1
请注意,数据框垂直连接时列名必须匹配。否则,默认行为是水平连接。 - bbrame

24

只是添加一些细节:

例如:

list1 = [df1, df2, df3]

import pandas as pd
  • 按行连接并忽略索引

pd.concat(list1, axis=0, ignore_index=True)

注意:如果列名不相同,则会在不同的列值处插入 NaN

按列连接并保留列名

pd.concat(list1, axis=1, ignore_index=False)

如果ignore_index=True,则列名将被填充为从0到(n-1)的数字,其中n是唯一列名的计数


12

如果数据框的列不完全相同,请尝试以下操作:

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

11
在Python 3.6.5 / Pandas v0.23.0上,这个解决方案对我不起作用。它会出现“TypeError: data argument can't be an iterator”的错误。先将其转换为“list”(以模仿Python 2.7)也会导致意外的结果。 - jpp
如果所有数据框都有相同的列,我们应该怎么做? - Thony Nadhir

8
你也可以使用函数式编程来实现这个功能:
from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)

2
from functools import reduce to use reduce - nishant
3
不建议对多个DataFrame执行成对合并,这样做效率非常低。使用pd.concatjoin,两者都接受帧列表,并默认按索引进行连接。 - 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])

-1
pandas的concat函数也可以与functools一起使用。
from functors import reduce as reduce
import pandas as pd
deaf = pd.read_csv("http://www.aol.com/users/data.csv")
for q in range(0, Len(deaf)):
  new = map(lambda x: reduce(pd.concat(x))

请更详细地说明您的理由。谢谢。 - jorgiojohnas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接