【问题标题】:Joining two dataframes where each row in one dataframe matches two rows in other dataframe连接两个数据帧,其中一个数据帧中的每一行与另一个数据帧中的两行匹配
【发布时间】:2018-03-30 19:43:58
【问题描述】:

我尝试在三列上匹配两个数据框,即“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

df新

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 两次?问题不在于合并多个键 - 问题可能是在第一个数据框中,我总是有两行具有相同的代码/年/季度组合。

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

【问题讨论】:

  • 只需使用 df1.merge(df2, on = ['ticker', 'year', 'quarter'])
  • 这让我得到了除 0 行之外的所有列...
  • @Julia 我刚刚尝试了您在问题中的建议 (pd.merge(dfnew, df, how='left', left_on=['ticker', "year", "quarter"], right_on = ['ticker', "year", "quarter"])),它与您的示例数据完美配合,没有引入 NaNs。尝试再次读取数据并重新启动 Python 会话。

标签: python pandas dataframe merge


【解决方案1】:

使用默认参数合并方法 = '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

【讨论】:

  • 当我这样做时,我只剩下 0 行和所有列......如果我做外部,那么所有行都添加两次,一个只有信息代码、年、季度、exec_lname、工作职位和然后一次与股票行情,年,季度,每股收益,呼叫日期......与内部我根本没有行。
  • 嗯,当我们无法重现错误时,它很难提供帮助。它在您提供的数据上运行良好
【解决方案2】:

只需合并两个数据框并在“by”部分中指定变量名称。

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

【讨论】:

  • 伙计,这是R merge
猜你喜欢
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2018-05-03
  • 2021-05-12
  • 2021-03-10
相关资源
最近更新 更多