超过2个Pandas数据框的合并

30

我正在尝试将SQL查询转换为Python。SQL语句如下:

select * from table 1 
union
select * from table 2
union 
select * from table 3
union
select * from table 4
现在我有4个数据框 df1, df2, df3, df4,我想将它们联合起来,使得结果与SQL查询的结果相同。 我不确定应该使用哪种操作符,它等效于SQL的union? 提前感谢!!
注意: 所有数据帧的列名都相同。

你能用正确的语法编写查询并更详细地解释你的例子吗? - rdn87
欢迎来到 Stack Overflow。您可以查看 tour - jezrael
3个回答

54
如果我理解得正确,您正在寻找"concat"函数。 如果数据帧的列名相同,pandas.concat([df1, df2, df3, df4])应该能够正确运行。

感谢concat语法。它为我完成了工作。 - User1090

7

如果我理解正确,您可以使用merge并按所有数据框的matching_col列进行连接:

import pandas as pd

# Merge multiple dataframes
df1 = pd.DataFrame({"matching_col": pd.Series({1: 4, 2: 5, 3: 7}), 
                    "a": pd.Series({1: 52, 2: 42, 3:7})}, columns=['matching_col','a'])
print df1
   matching_col   a
1             4  52
2             5  42
3             7   7

df2 = pd.DataFrame({"matching_col": pd.Series({1: 2, 2: 7, 3: 8}), 
                    "a": pd.Series({1: 62, 2: 28, 3:9})}, columns=['matching_col','a'])
print df2
   matching_col   a
1             2  62
2             7  28
3             8   9

df3 = pd.DataFrame({"matching_col": pd.Series({1: 1, 2: 0, 3: 7}), 
                    "a": pd.Series({1: 28, 2: 52, 3:3})}, columns=['matching_col','a'])
print df3
   matching_col   a
1             1  28
2             0  52
3             7   3

df4 = pd.DataFrame({"matching_col": pd.Series({1: 4, 2: 9, 3: 7}), 
                    "a": pd.Series({1: 27, 2: 24, 3:7})}, columns=['matching_col','a'])
print df4
   matching_col   a
1             4  27
2             9  24
3             7   7

解决方案1:

df = pd.merge(pd.merge(pd.merge(df1,df2,on='matching_col'),df3,on='matching_col'), df4, on='matching_col')
set columns names
df.columns = ['matching_col','a1','a2','a3','a4']
print df

   matching_col  a1  a2  a3  a4
0             7   7  28   3   7

解决方案2:

dfs = [df1, df2, df3, df4]
#use built-in python reduce
df = reduce(lambda left,right: pd.merge(left,right,on='matching_col'), dfs)
#set columns names
df.columns = ['matching_col','a1','a2','a3','a4']
print df

   matching_col  a1  a2  a3  a4
0             7   7  28   3   7

但如果你只需要连接数据框,可以使用concat函数,并通过参数ignore_index=True重置索引:

print pd.concat([df1, df2, df3, df4], ignore_index=True)

    matching_col   a
0              4  52
1              5  42
2              7   7
3              2  62
4              7  28
5              8   9
6              1  28
7              0  52
8              7   3
9              4  27
10             9  24
11             7   7

3

合并(merge)比连接(concat)更好的原因是什么? - SquattingSlavInTracksuit
1
一个快速的跟进问题:在pandas中,如何将外连接变成联合?有点困惑,因为它们在SQL中是不同的概念(我相信是集合论)? - Pradeep Puranik

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