连接两个数据帧,其中一个数据帧中的每一行与其他数据帧中的两行匹配

时间:2017-10-18 20:18:36

标签: python pandas dataframe merge

我尝试在三列上匹配两个数据框,即" ticker"," year"和" quarter"。虽然第一个数据集包含每个自动收报机,年,季度的两个观察值(即两行),但第二个数据集仅包含一行...特别是,第一个数据帧始终在同一季度捕获两个不同的扬声器,而第二个数据帧仅捕获公司信息。现在,我想匹配数据帧,以便同一公司季度中第一个数据帧的两行中的每一行都与第二个数据帧中的一个相关行合并。

我的数据如下: DF

ticker  year    quarter exec_lname  jobposition
XX      2009    3       A           CEO
XX      2009    3       B           CFO
XX      2009    4       A           CEO
XX      2009    4       B           CFO
YY      2007    1       C           CEO
YY      2007    1       D           CFO
YY      2007    2       C           CEO
YY      2007    2       D           CFO
ZZ      2008    3       F           CEO
ZZ      2008    3       G           CFO

dfnew

ticker  year    quarter eps calldate
XX      2009    3       x   Mar
XX      2009    4       y   Apr
YY      2007    1       z   Feb
YY      2007    2       a   Jan
ZZ      2008    3       b   Dec

最后,它应该是这样的:

ticker  year    quarter exec_lname  jobposition eps calldate
XX      2009    3       A           CEO         x   Mar
XX      2009    3       B           CFO         x   Mar
XX      2009    4       A           CEO         y   Apr
XX      2009    4       B           CFO         y   Apr
YY      2007    1       C           CEO         z   Feb
YY      2007    1       D           CFO         z   Feb
YY      2007    2       C           CEO         a   Jan
YY      2007    2       D           CFO         a   Jan
ZZ      2008    3       F           CEO         b   Dec
ZZ      2008    3       G           CFO         b   Dec

我试过了:

dfjoin = pd.merge(dfnew, df,  how='left', left_on=['ticker', "year", "quarter"], right_on = ['ticker', "year", "quarter"])

但它返回包含所有正确行和列的新数据集,但是列和eps和calldate完全填充了NaN。可能这是因为我想将每一行合并两次到df?问题不在于合并多个密钥 - 问题可能是在第一个数据框中我总是有两行具有相同的股票代码/年/季度组合。

我希望有人可以帮助我! 谢谢! 朱莉娅

2 个答案:

答案 0 :(得分:0)

使用合并默认参数how ='inner'

df.merge(dfnew, on = ['ticker', 'year', 'quarter'])

你得到了

    ticker  year    quarter exec_lname  jobposition eps calldate
0   XX      2009    3       A           CEO         x   Mar
1   XX      2009    3       B           CFO         x   Mar
2   XX      2009    4       A           CEO         y   Apr
3   XX      2009    4       B           CFO         y   Apr
4   YY      2007    1       C           CEO         z   Feb
5   YY      2007    1       D           CFO         z   Feb
6   YY      2007    2       C           CEO         a   Jan
7   YY      2007    2       D           CFO         a   Jan
8   ZZ      2008    3       F           CEO         b   Dec
9   ZZ      2008    3       G           CFO         b   Dec

答案 1 :(得分:0)

只需合并两个数据框,并在" "指定变量名称。部分。

  

合并(df,dfnew,by = c(" ticker"," year"," quarter"),all.x = TRUE)