gpt4 book ai didi

python - 如何根据过滤后的总和合并两个 DataFrame?

转载 作者:行者123 更新时间:2023-11-28 20:01:04 25 4
gpt4 key购买 nike

我有两个像这样的 DataFrame

   start_date    end_date
1 2018-01-01 2018-01-31
2 2018-01-15 2018-02-28
3 2018-01-31 2018-03-15
4 2018-01-07 2018-04-30

value
2018-01-01 1
2018-01-02 4
2018-01-03 2
2018-01-04 10
2018-01-05 0
... ...
2018-12-28 1
2018-12-29 7
2018-12-30 9
2018-12-31 5

我正在尝试向第一个 DataFrame 添加一个新列,其中包含第二个 DataFrame 的总和值,按 start_dateend_date 过滤。有点像

   start_date    end_date  total_value
1 2018-01-01 2018-01-31 47 # Where 47 is the sum of values between 2018-01-01 and 2018-01-31, inclusive
2 2018-01-15 2018-02-28 82
3 2018-01-31 2018-03-15 116
4 2018-01-07 2018-04-30 253

我想我可以用 apply 来做到这一点(基本上只是通过 start_dateend_date 过滤和总结第二个 DataFrame 并返回总和) ,但我想知道是否有一个简洁的 Pandas 式解决方案。

最佳答案

新答案

我正在使用 OP 数据,需要稍微修改一下

df2 = df2.asfreq('D').fillna(0, downcast='infer')

然后我们执行 cumsum 操作并增加一个类次。

s = df2.value.cumsum()
starts = df1.start_date.map(s.shift().fillna(0, downcast='infer'))
ends = df1.end_date.map(s)

df1.assign(total_value=ends - starts)

start_date end_date total_value
1 2018-01-01 2018-01-31 17
2 2018-01-15 2018-02-28 0
3 2018-01-31 2018-03-15 0
4 2018-01-07 2018-04-30 0

旧答案

很酷,但不准确。这是开始日期之后的数字总和。为了包括开始日期,我必须使用轮类。见上文。

您可以使用 cumsum 并取差。

df1.assign(
total_value=df1.applymap(df2.cumsum().value.get).eval('end_date - start_date'))

start_date end_date total_value
1 2018-01-01 2018-01-31 145
2 2018-01-15 2018-02-28 229
3 2018-01-31 2018-03-15 212
4 2018-01-07 2018-04-30 535

设置

np.random.seed([3, 1415])

min_date = df1.values.min()
max_date = df1.values.max()
tidx = pd.date_range(min_date, max_date)
df2 = pd.DataFrame(dict(value=np.random.randint(10, size=len(tidx))), tidx)

关于python - 如何根据过滤后的总和合并两个 DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51988762/

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