[英]How can I connect two dataframes based on mutliple criteria in python?
我有以下两个数据框:
入围名单:
ticker date open high low close volume
ABC 2000-12-29 0.450 0.455 0.445 0.455 205843.0
ABC 2001-01-31 0.410 0.410 0.405 0.410 381500.0
ABC 2001-02-28 0.380 0.405 0.380 0.400 318384.0
...
ABC 2001-06-30 0.430 0.445 0.430 0.440 104016.0
MCap
Code EOM mcRank MktCap
ABC 29/12/2000 74 1563.967892
ABC 31/03/2001 98 998.156279
ABC 30/06/2001 59 2035.603350
我现在想创建一个新表,将 MCap dataframe 中的 mcRank 和 MktCap 列添加到 Shortlist dataframe 中,其中代码和日期匹配。 如果日期在 MCap 中的日期之间,则应使用最后一个已知日期。
结果应该是这样的:
ticker date open high low close volume mcRank MktCap
ABC 2000-12-29 0.450 0.455 0.445 0.455 205843.0 74 1563.967892
ABC 2001-01-31 0.410 0.410 0.405 0.410 381500.0 74 1563.967892
ABC 2001-02-28 0.380 0.405 0.380 0.400 318384.0 74 1563.967892
...
ABC 2001-06-30 0.430 0.445 0.430 0.440 104016.0 59 2035.603350
我已经尝试过 pd.concat 和 pd.merge - 但似乎无法获得正确的结果。
你想做的是
首先对齐两种日期格式,您可以将其处理为字符串,这样更容易
第二个 pd.merge 它们,使用 left_on、right_on 和 how='outer' 合并所有内容,并故意创建 NA 值
然后你可以使用 DataFrame.fillna(method='ffill') 根据以前的值填充 na
好吧,这似乎是一个merge
任务,但首先要确保EOM
和date
列实际上是相同的变量 dtype ( datetime
)。
shortlist['date'] = pd.to_datetime(shortlist['date'], format='%Y-%m-%d')
MCap['EOM'] = pd.to_datetime(MCap['EOM'], format='%d/%m/%Y')
然后进行合并(如果ticker
或Codes
是索引,这将不起作用,如果是,则首先重置索引,即shortlist.rest_index(inplace=True)
):
new_df = shortlist.merge(how='left', left_on=['ticker', 'date'], right_on=['Code', 'EOM']).reset_index()
国际大学联合会,
您可能必须分解这些步骤:首先在日期上合并两个数据帧(我使用连接函数),然后使用 mcap 中最旧的日期填写 null 值(我使用您的 output 的结果作为指南) :
转换为日期时间并设置索引
df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d')
df = df.set_index('date')
mcap['EOM'] = pd.to_datetime(mcap['EOM'])
mcap = mcap.set_index("EOM")
结合数据框:
res = df.join(mcap)
获取 null 行的索引:
indices = res[res.isna().any(axis=1)].index
从 mcap 获取最早日期的值:
latest_mcap = mcap.loc[mcap.index.min()].tolist()
将 latest_mcap 分配给 res 中的 null 值:
res.loc[indices,['Code','mcRank','MktCap']] = latest_mcap
ticker open high low close volume Code mcRank MktCap
date
2000-12-29 ABC 0.45 0.455 0.445 0.455 205843.0 ABC 74.0 1563.967892
2001-01-31 ABC 0.41 0.410 0.405 0.410 381500.0 ABC 74.0 1563.967892
2001-02-28 ABC 0.38 0.405 0.380 0.400 318384.0 ABC 74.0 1563.967892
2001-06-30 ABC 0.43 0.445 0.430 0.440 104016.0 ABC 59.0 2035.603350
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.