【发布时间】: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