合并两个日期字段在两个月内的 pandas DataFrame
Posted
技术标签:
【中文标题】合并两个日期字段在两个月内的 pandas DataFrame【英文标题】:Combine two pandas DataFrames where the date fields are within two months of each other 【发布时间】:2017-09-19 03:22:23 【问题描述】:我需要合并 df1.date 在 df2 前 2 个月内的 2 个 pandas 数据帧。然后我想计算在此期间有多少交易者交易了同一只股票并计算购买的总股票。
我尝试过使用下面列出的方法,但发现它太复杂了。我相信会有更智能/更简单的解决方案。
Pandas: how to merge two dataframes on offset dates?
示例数据集如下:
DF1 (team_1):
date shares symbol trader
31/12/2013 154 FDX Max
30/06/2016 2367 GOOGL Max
21/07/2015 293 ORCL Max
18/07/2015 304 ORCL Sam
DF2(团队_2):
date shares symbol trader
23/08/2015 345 ORCL John
04/07/2014 567 FB John
06/12/2013 221 ACER Sally
31/11/2012 889 HP John
05/06/2010 445 ABBV Kate
需要的输出:
date shares symbol trader team_2_traders team_2_shares_bought
23/08/2015 345 ORCL John 2 597
04/07/2014 567 FB John 0 0
06/12/2013 221 ACER Sally 0 0
31/11/2012 889 HP John 0 0
05/06/2010 445 ABBV Kate 0 0
这会添加 2 个新列... 'team_2_traders' = 从 DF2 上列出的日期算起的前 2 个月内,有多少来自 team_1 的交易者交易了相同的股票。 'team_2_shares_bought' = team_1 自 DF2 上市之日起过去 2 个月内购买的总股份数。
如果有人愿意对此进行破解,请使用下面的 sn-p 设置数据帧。请记住,实际数据集包含数百万行和 6,000 支公司股票。
team_1 = 'symbol':['FDX','GOOGL','ORCL','ORCL'],
'date':['31/12/2013','30/06/2016','21/07/2015','18/07/2015'],
'shares':[154,2367,293,304],
'trader':['Max','Max','Max','Sam']
df1 = pd.DataFrame(team_1)
team_2 = 'symbol':['ORCL','FB','ACER','HP','ABBV'],
'date':['23/08/2015','04/07/2014','06/12/2013','31/11/2012','05/06/2010'],
'shares':[345,567,221,889,445],
'trader':['John','John','Sally','John','Kate']
df2 = pd.DataFrame(team_2)
感谢您的帮助 - 谢谢。
【问题讨论】:
【参考方案1】:请检查我的解决方案。
from pandas.tseries.offsets import MonthEnd
df_ = df2.merge(df1, on=['symbol'])
df_['date_x'] = pd.to_datetime(df_['date_x'])
df_['date_y'] = pd.to_datetime(df_['date_y'])
df_2m = df_[df_['date_x'] < df_['date_y'] + MonthEnd(2)] \
.loc[:, ['date_y', 'shares_y', 'symbol', 'trader_y']] \
.groupby('symbol')
df1_ = pd.concat([df_2m['shares_y'].sum(), df_2m['trader_y'].count()], axis=1)
print(df1_)
shares_y trader_y
symbol
ORCL 597 2
print(df2.merge(df1_.reset_index(), on='symbol', how='left').fillna(0))
date shares symbol trader shares_y trader_y
0 23/08/2015 345 ORCL John 597.0 2.0
1 04/07/2014 567 FB John 0.0 0.0
2 06/12/2013 221 ACER Sally 0.0 0.0
3 30/11/2012 889 HP John 0.0 0.0
4 05/06/2010 445 ABBV Kate 0.0 0.0
【讨论】:
谢谢,但您的解决方案不包括所需的日期范围内查找。 哦,我错过了约束,请再次检查。我更新了代码。 效果很好,谢谢!稍后我将在大数据集上进行尝试。干杯!以上是关于合并两个日期字段在两个月内的 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间
在 Pandas GroupBy 数据框中按 ID 计算两个日期之间的行数