python - 根据来自另一个数据帧的范围从数据帧中选择最小值
问题描述
我有一个数据框df1
:
Type StDt EnDt
A 1/2/2012 1/4/2012
B 1/6/2012 1/6/2012
我有另一个数据框df2
,所有日期到 2019 年为:
KBWI
Date
2012-01-02 45.00
2012-01-03 32.00
2012-01-04 14.00
2012-01-05 26.00
2012-01-06 27.00
对于 中的每一行df1
,我需要使用日期范围 StDt、EnDt 从 df2 中提取所有行并取其最小值以获得以下结果:
Type StDt EnDt Minimum
A 1/2/2012 1/4/2012 14.00
B 1/6/2012 1/6/2012 27.00
由于数据框很大,我不确定如何有效地做到这一点。
解决方案
初步准备:将所有涉及的列和索引转换为datetime
.
df[['StDt', 'EnDt']] = df[['StDt', 'EnDt']].apply(pd.to_datetime, errors='coerce')
df2.index = pd.to_datetime(df2.index, errors='coerce')
df
Type StDt EnDt
0 A 2012-01-02 2012-01-04
1 B 2012-01-06 2012-01-06
df2
KBWI
Date
2012-01-02 45.0
2012-01-03 32.0
2012-01-04 14.0
2012-01-05 26.0
2012-01-06 27.0
一种简单的方法是使用pd.IntervalIndex
并groupby
找到最小值:
idx = pd.IntervalIndex.from_arrays(df['StDt'], df['EnDt'], closed='both')
df['Minimum'] = df2['KBWI'].groupby(idx.get_indexer_non_unique(df2.index)).min()
df
Type StDt EnDt Minimum
0 A 2012-01-02 2012-01-04 14.0
1 B 2012-01-06 2012-01-06 27.0
假设df
' 的索引也是一个RangeIndex
(数字,单调递增)。
推荐阅读
- python - 如何从文本中提取所有类型的日期格式
- swift - 使用图像选择器后,应用程序中的所有声音都会静音
- java - 使用 Java 进行金字塔打印
- javascript - Vue中单击元素后的事件
- html - materializecss:如何让图像留在列中
- crystal-reports - SAP Business Objects - 每个报表的列表及其用户访问权限
- swift - 快速滚动后 didDeselectItemAt 不起作用
- java - 如果以前的网页没有在 WEB VIEW 中加载,如何将其更改为我自己的网页?
- javascript - 防止重复提交
- html - 激活时更改菜单背景颜色