gpt4 book ai didi

python - Pandas :merge_asof() 对多行求和/不重复

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:15 25 4
gpt4 key购买 nike

我正在处理两个数据集,每个数据集都有不同的关联日期。我想合并它们,但由于日期不完全匹配,我相信 merge_asof() 是最好的方法。

但是,merge_asof() 会发生两件不理想的事情:

  1. 数字重复。
  2. 数字丢失了。

下面的代码是一个例子:

df_a = pd.DataFrame({'date':pd.to_datetime(['1/15/2016','3/15/2016','5/15/2016','7/15/2016'])})
df_b = pd.DataFrame({'date':pd.to_datetime(['1/1/2016','4/1/2016','5/1/2016','6/1/2016','7/1/2016']), 'num':[1,10,100,1000,10000]})

df_x = pd.merge_asof(df_a, df_b, on = 'date')

这会产生:

        date    num
0 2016-01-15 1
1 2016-03-15 1
2 2016-05-15 100
3 2016-07-15 10000

但我想要:

        date    num
0 2016-01-15 1
1 2016-03-15 0
2 2016-05-15 110
3 2016-07-15 11000

...将日期之间的多行集合相加,而不仅仅是选择最接近的行。

merge_asof() 是否可行,还是我应该寻找其他解决方案?

最佳答案

你要从 B 中获取 A 的前一行和当前行之间的行。我可以很容易地得到第一个和最后一个索引:

# get the previous dates from A:
prev_dates = np.roll(df_a.date, 1)
prev_dates[0] = pd.to_datetime(0)

# get the first and last index of B:
start = np.searchsorted(df_b.date, prev_dates)
stop = np.searchsorted(df_b.date, df_a.date, side='right') - 1

现在我可以使用一点列表理解来获得我的结果:

>>> [df_b.num.values[begin:end+1].sum() for begin, end in zip(start, stop)]
[1, 0, 110, 11000]

关于python - Pandas :merge_asof() 对多行求和/不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42353481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com