Python 将数据帧列表连接在一起

Python 将数据帧列表连接在一起,python,pandas,dataframe,concat,Python,Pandas,Dataframe,Concat,我有一个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

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

我想将
d1
d2
d3
组合成一个数据帧。或者,当使用
chunksize
选项时,将大型ish表直接读入数据帧的方法将非常有用

假设所有数据帧都有相同的列,您可以简单地
concat
它们:

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

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

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

您也可以通过函数式编程来实现:

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

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])

只需添加更多细节:

例如:

  • 行连接&忽略索引

    pd.concat(list1, axis=0, ignore_index=True)
    
    注意:如果列名不同,则会在不同的列值处插入NaN

  • 按列连接&要保留列名吗

    pd.concat(list1, axis=1, ignore_index=False)
    
    如果ignore_index=True,列名将由从0到(n-1)的数字填充,其中n是唯一列名的计数

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

如果它们没有相同的列,您可以先将它们强制转换为dict,然后使用from_dict-请参见下文如果要添加列,请记住添加axis=1参数,我想,即使一些
data.frame
没有相同的列,那么
NaN
将被插入,而不会在新版本的
pandas
中抛出错误。这个解决方案在Python 3.6.5/pandas v0.23.0上对我不起作用。类型错误:数据参数不能是迭代器。首先转换到
list
(模仿Python 2.7)也会产生意外的结果。如果所有数据帧都有相同的列,我们应该怎么做?
从functools导入reduce
到使用
reduce
不建议对多个数据帧进行成对合并,这根本没有效率。请参见
pd.concat
join
,默认情况下,两者都接受帧列表并在索引上进行连接。