簡體   English   中英

給定另一個 dataframe 中兩列的值約束,在一個 dataframe 的列中查找最大值

[英]Find maximum of value in a column of one dataframe given the value constraint of two columns in another dataframe

我有一個 dataframe, df1 有兩列代表任務的開始和結束時間。 我還有另一個 dataframe,df2,兩列代表時間和當時可用的庫存。 我想在 df1 中創建另一個名為 max_stock 的列,該列在 df1 的 ST 和 ET 給出的時間范圍內具有最大值的股票值。 例如,第一個任務的開始時間是7/11/2021 1:00 ,結束時間是7/11/2021 2:00 max_stock這個值是 df2 的stock列中的最大值,最大值為 10、26、和 48 在時間7/11/2021 1:007/11/2021 1:307/11/2021 2:00分別。

df1

ST              ET
7/11/2021 1:00  7/11/2021 2:00
7/11/2021 2:00  7/11/2021 3:00
7/11/2021 3:00  7/11/2021 4:00
7/11/2021 4:00  7/11/2021 5:00
7/11/2021 5:00  7/11/2021 6:00
7/11/2021 6:00  7/11/2021 7:00
7/11/2021 7:00  7/11/2021 8:00
7/11/2021 8:00  7/11/2021 9:00
7/11/2021 9:00  7/11/2021 10:00

df2

Time            stock
7/11/2021 1:00  10
7/11/2021 1:30  26
7/11/2021 2:00  48
7/11/2021 2:30  35
7/11/2021 3:00  32
7/11/2021 3:30  80
7/11/2021 4:00  31
7/11/2021 4:30  81
7/11/2021 5:00  65
7/11/2021 5:30  83
7/11/2021 6:00  40
7/11/2021 6:30  84
7/11/2021 7:00  41
7/11/2021 7:30  15
7/11/2021 8:00  65
7/11/2021 8:30  18
7/11/2021 9:00  80
7/11/2021 9:30  12
7/11/2021 10:00  5

必需的df

ST              ET              max_stock
7/11/2021 1:00  7/11/2021 2:00  48.00
7/11/2021 2:00  7/11/2021 3:00  48.00
7/11/2021 3:00  7/11/2021 4:00  80.00
7/11/2021 4:00  7/11/2021 5:00  81.00
7/11/2021 5:00  7/11/2021 6:00  83.00
7/11/2021 6:00  7/11/2021 7:00  84.00
7/11/2021 7:00  7/11/2021 8:00  65.00
7/11/2021 8:00  7/11/2021 9:00  80.00
7/11/2021 9:00  7/11/2021 10:00 80.00

一種選擇是通過pyjanitorconditional_join在分組和聚合之前模擬大於和小於條件:

# pip install pyjanitor
import pandas as pd
import janitor

(df1.conditional_join(
            df2, 
            ('ST', 'Time', '<='), 
            ('ET', 'Time', '>='))
    .groupby(['ST', 'ET'], as_index = False)
    .stock
    .max()
)
                   ST                  ET  stock
0 2021-07-11 01:00:00 2021-07-11 02:00:00     48
1 2021-07-11 02:00:00 2021-07-11 03:00:00     48
2 2021-07-11 03:00:00 2021-07-11 04:00:00     80
3 2021-07-11 04:00:00 2021-07-11 05:00:00     81
4 2021-07-11 05:00:00 2021-07-11 06:00:00     83
5 2021-07-11 06:00:00 2021-07-11 07:00:00     84
6 2021-07-11 07:00:00 2021-07-11 08:00:00     65
7 2021-07-11 08:00:00 2021-07-11 09:00:00     80
8 2021-07-11 09:00:00 2021-07-11 10:00:00     80

您可以在之后使用笛卡爾連接和過濾(對於大型數據幀,這可能是 memory 效率低下):

(df1.merge(df2, how='cross')
    .query('ST <=Time <= ET')
    .groupby(['ST', 'ET'], as_index = False)
    .stock
    .max()
)
Out[113]:
                   ST                  ET  stock
0 2021-07-11 01:00:00 2021-07-11 02:00:00     48
1 2021-07-11 02:00:00 2021-07-11 03:00:00     48
2 2021-07-11 03:00:00 2021-07-11 04:00:00     80
3 2021-07-11 04:00:00 2021-07-11 05:00:00     81
4 2021-07-11 05:00:00 2021-07-11 06:00:00     83
5 2021-07-11 06:00:00 2021-07-11 07:00:00     84
6 2021-07-11 07:00:00 2021-07-11 08:00:00     65
7 2021-07-11 08:00:00 2021-07-11 09:00:00     80
8 2021-07-11 09:00:00 2021-07-11 10:00:00     80

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM