我有一个datafrme 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
由于数据帧很大,我不确定如何有效地做到这一点。
答案 0 :(得分:2)
制备初报:所有涉及的列和指数转化为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
(数字,单调递增)的情况下工作。