合并两个或多个不重叠的列

时间:2016-06-14 00:37:11

标签: python pandas dataframe merge

关注这篇文章: Merging two columns which don't overlap and create new columns

import pandas as pd

df1 = pd.DataFrame([["2014", "q2", 2],
                   ["2013", "q1", 1],],
                   columns=('Year', 'Quarter', 'Value'))

df2 = pd.DataFrame([["2016", "q1", 3], 
                    ["2015", "q1", 3]],
                   columns=('Year', 'Quarter', 'Value'))


print(df1.merge(df2, on='Year', how='outer'))

结果:

  Year   Quarter_x  Value_x  Quarter_y  Value_y
0  2014        q2        2       NaN     NaN
1  2013        q1        1       NaN     NaN
2  2016       NaN      NaN        q1     3
3  2015       NaN      NaN        q1     3

但我希望得到这个:

   Year    Quarter   Value 
0  2014        q2        2      
1  2013        q1        1     
2  2016        q1        3
3  2015        q1        3

注意:这不会产生所需的结果...... :(

print(df1.merge(df2, on=['Year', 'Quarter','Value'], how='outer').dropna())

   Year Quarter  Value
0  2014      q2      2
1  2013      q1      1

...使用“左”或右'或内部也不会削减它。

3 个答案:

答案 0 :(得分:2)

不确定这里发生了什么,但如果我这样做

df1.merge(df2, on=['Year', 'Quarter', 'Value'], how='outer').dropna()

我明白了:

   Year Quarter  Value
0  2014      q2    2.0
1  2013      q1    1.0
2  2016      q1    3.0
3  2015      q1    3.0

您可能需要查看merge, join & concat docs

最“直观”的方式可能是.append()

df1.append(df2)

   Year Quarter  Value
0  2014      q2    2.0
1  2013      q1    1.0
2  2016      q1    3.0
3  2015      q1    3.0

如果你查看源代码,你会发现它在幕后调用concat

Merge非常有用,适用于columns值重叠的情况。

答案 1 :(得分:2)

pandas concat更适合这种情况。

pd.concat([df1, df2]).reset_index(drop=True)

   Year Quarter  Value
0  2014      q2      2
1  2013      q1      1
2  2016      q1      3
3  2015      q1      3

concat旨在将一个数据框放在另一个数据框旁边,同时保持索引或列对齐。在默认情况下,它会使列保持对齐。考虑到您的示例数据框,列已对齐,并且您所声明的预期输出显示df2恰好位于列对齐的df1之后。您所要求的每个方面都正是concat旨在提供的内容。我所做的就是指出一个合适的功能。

答案 2 :(得分:1)

您正在寻找追加功能:

df_final = df1.append(df2)