首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据id和日期范围合并pandas数据框

根据id和日期范围合并pandas数据框
EN

Stack Overflow用户
提问于 2018-06-05 00:18:28
回答 1查看 1.1K关注 0票数 1

我需要执行合并来将一组新的ids映射到一组旧的ids。我的起始数据如下所示:

代码语言:javascript
运行
复制
lst = [10001, 20001, 30001]
dt = pd.date_range(start='2016', end='2018', freq='M')
idx = pd.MultiIndex.from_product([dt,lst],names=['date','id'])
df = pd.DataFrame(np.random.randn(len(idx)), index=idx)

In [94]: df.head()
Out[94]:
                         0
date       id
2016-01-31 10001 -0.512371
           20001 -1.164461
           30001 -1.253232
2016-02-29 10001 -0.129874
           20001  0.711938

我想使用如下所示的数据将id映射到newid

代码语言:javascript
运行
复制
df1 = pd.DataFrame({'id': [10001, 10001, 10001, 10001],
'start_date': ['2015-11-31', '2016-02-01', '2016-05-16', '2017-02-16'],
'end_date': ['2016-01-31', '2016-05-15', '2017-02-15', '2018-04-02'],
'new_id': ['ABC123', 'XYZ789', 'HIJ456', 'LMN654']},)
df2 = pd.DataFrame({'id': [20001, 20001, 20001, 20001],
'start_date': ['2015-10-07', '2016-01-08', '2016-06-02', '2017-02-13'],
'end_date': ['2016-01-07', '2016-06-01', '2017-02-12', '2018-03-017'],
'new_id': ['CBA321', 'ZYX987', 'JIH765', 'NML345']},)
df3 = pd.DataFrame({'id': [30001, 30001, 30001, 30001],
'start_date': ['2015-07-31', '2016-02-23', '2016-06-17', '2017-05-12'],
'end_date': ['2016-02-22', '2016-06-16', '2017-05-11', '2018-01-05'],
'new_id': ['CCC333', 'XXX444', 'HHH888', 'III888']},)
df_ranges = pd.concat([df1,df2,df3])
In [95]: df_ranges.head()
Out[95]:
   index    end_date     id  new_id  start_date
0      0  2016-01-31  10001  ABC123  2015-11-31
1      1  2016-05-15  10001  XYZ789  2016-02-01
2      2  2017-02-15  10001  HIJ456  2016-05-16
3      3  2018-04-02  10001  LMN654  2017-02-16
4      0  2016-01-07  20001  CBA321  2015-10-07

基本上,我的数据是月度面板数据,新数据具有从A->B的特定映射有效的日期范围。因此,映射数据的第1行表明,从2016-01-31到2015-211-31,id 10001映射到ABC123

我以前在SAS/SQL中使用过这样的语句:

代码语言:javascript
运行
复制
SELECT a.*, b.newid FROM df as a, df_ranges as b 
WHERE a.id = b.id AND b.start_date <= a.date < b.end_date

关于数据的几点注意事项:

  1. 它应该是id到newid的1:1映射。
  2. 日期范围为non-overlapping

这里的解决方案可能是一个好的开始:Merging dataframes based on date range

这正是我正在寻找的,除了它只在日期上合并,而不是在id上额外合并。我尝试了groupby()和这个解决方案,但没有找到一种方法来使其工作。我的另一个想法是拆分()映射数据(df_ranges)以匹配df的维度/时间频率,但这似乎只是简单地重申了现有的问题。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50684852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档