联盟在2个以上的熊猫数据框架中

时间:2016-01-08 09:31:53

标签: python join pandas merge concat

我正在尝试将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中有这些表,我想结合4个pandas数据帧,这个数据帧与sql查询相同。 我很困惑使用哪种操作相当于sql union? 在此先感谢!!

注意: 所有数据框的列名都相同。

3 个答案:

答案 0 :(得分:16)

如果我很清楚这个问题,那么您正在寻找concat功能。

如果两个数据帧的列名相同,则

pandas.concat([df1, df2, df3, df4])应该可以正常工作。

答案 1 :(得分:2)

这应该是对Jezrael的答案的评论(mergeconcat + 1)但我没有足够的声誉。

OP询问如何union dfs,但merge默认返回intersection:  http://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge.html#pandas.merge

要获得union,请将how='outer'添加到merge来电。

答案 2 :(得分:1)

IIUC您可以使用merge并按所有数据框的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 列加入:

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

<强>解决方法1

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

<强>溶液2

ignore_index=True

但如果您只需要concat数据帧,请使用concat并按参数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 重置索引:

data.table