【问题标题】:Merge two pandas data frames, one has infrequent dates and should be merged by the most recent date合并两个 pandas 数据框,一个日期不频繁,应按最近日期合并
【发布时间】:2021-02-19 20:45:41
【问题描述】:

ab 是 pandas 数据帧,a 的更新频率低于b。 例如

a = pd.DataFrame({'id': np.array([1, 3, 4, 9]*2),
                  'date': np.repeat(['2021-01-03', '2021-02-06'], 4),
                  'score': np.linspace(0, 1, 8)})
a['date'] = pd.to_datetime(a['date'])

b = pd.DataFrame({'id': np.array([1, 3, 4, 9]*5),
                  'date': np.repeat(['2021-01-03', '2021-01-15', '2021-01-23', '2021-02-08', '2021-02-17'], 4),
                  'value': np.linspace(0, 1, 20)})
b['date'] = pd.to_datetime(b['date'])

我想通过将b 中的 id 和日期与a 中的最新日期进行匹配来合并这两个帧,因此在此示例中,我需要以下日期配对以进行合并:

b          -> a
2021-01-03 -> 2021-01-03
2021-01-15 -> 2021-01-03
2021-01-23 -> 2021-01-03
2021-02-08 -> 2021-02-06
2021-02-17 -> 2021-02-06

我可以在a 中的每个日期上进行for 循环,选择b 中位于a 中每对相邻日期之间的数据,然后从@987654333 添加score @ 作为一个新列,然后将这些帧连接在一起,但是有更快的方法吗?

【问题讨论】:

  • 你检查过merge_asof() 吗?
  • @CeliusStingher 我没有听说过这个功能,但我肯定会从现在开始使用它

标签: python pandas merge


【解决方案1】:

通过onby参数使用merge_asof

df = pd.merge_asof(b, a, on='date', by='id')

对于测试列重命名为date1

a = pd.DataFrame({'id': np.array([1, 3, 4, 9]*2),
                  'date': np.repeat(['2021-01-03', '2021-02-06'], 4),
                  'score': np.linspace(0, 1, 8)})
a['date'] = pd.to_datetime(a['date'])

b = pd.DataFrame({'id': np.array([1, 3, 4, 9]*5),
                  'date1': np.repeat(['2021-01-03', '2021-01-15', '2021-01-23', '2021-02-08', '2021-02-17'], 4),
                  'value': np.linspace(0, 1, 20)})
b['date1'] = pd.to_datetime(b['date1'])

df = pd.merge_asof(b, a, left_on='date1', right_on='date', by='id')
print (df)
    id      date1     value       date     score
0    1 2021-01-03  0.000000 2021-01-03  0.000000
1    3 2021-01-03  0.052632 2021-01-03  0.142857
2    4 2021-01-03  0.105263 2021-01-03  0.285714
3    9 2021-01-03  0.157895 2021-01-03  0.428571
4    1 2021-01-15  0.210526 2021-01-03  0.000000
5    3 2021-01-15  0.263158 2021-01-03  0.142857
6    4 2021-01-15  0.315789 2021-01-03  0.285714
7    9 2021-01-15  0.368421 2021-01-03  0.428571
8    1 2021-01-23  0.421053 2021-01-03  0.000000
9    3 2021-01-23  0.473684 2021-01-03  0.142857
10   4 2021-01-23  0.526316 2021-01-03  0.285714
11   9 2021-01-23  0.578947 2021-01-03  0.428571
12   1 2021-02-08  0.631579 2021-02-06  0.571429
13   3 2021-02-08  0.684211 2021-02-06  0.714286
14   4 2021-02-08  0.736842 2021-02-06  0.857143
15   9 2021-02-08  0.789474 2021-02-06  1.000000
16   1 2021-02-17  0.842105 2021-02-06  0.571429
17   3 2021-02-17  0.894737 2021-02-06  0.714286
18   4 2021-02-17  0.947368 2021-02-06  0.857143
19   9 2021-02-17  1.000000 2021-02-06  1.000000

【讨论】:

  • @Alex - 我添加了测试解决方案,以便查看日期之间的正确映射。也许有人想念它......
猜你喜欢
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2016-01-30
  • 2019-05-27
  • 2017-08-26
  • 2020-06-30
  • 2014-08-28
相关资源
最近更新 更多