【问题标题】:Union in more than 2 pandas dataframe超过 2 个 pandas 数据框中的联合
【发布时间】:2016-04-12 22:21:11
【问题描述】:

我正在尝试将 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 个熊猫数据框,它的结果与 sql 查询相同。 我对使用什么操作相当于 sql union 感到困惑? 提前致谢!!

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

【问题讨论】:

  • 你能用正确的语法写出你的查询并解释你的例子吗?
  • 欢迎来到Stack Overflow。您可以查看tour

标签: python join pandas merge concat


【解决方案1】:

如果我很好地理解了这个问题,您正在寻找concat 函数。

如果两个数据框的列名相同,pandas.concat([df1, df2, df3, df4]) 应该可以正常工作。

【讨论】:

  • 感谢 concat 语法。这对我有用
【解决方案2】:

IIUC 你可以使用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】:

    这应该是对 Jezrael 的回答的评论(merge 超过 concat),但我没有足够的声誉。

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

    要获取unions,请将how='outer' 添加到merge 调用中。

    【讨论】:

    • 为什么合并比 concat 更好?
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2013-12-17
    • 2015-10-14
    • 2013-05-16
    • 2017-12-07
    • 2016-08-20
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多