如何根据python中另一列的条件在两个日期之间查找特定列的最大值

如何根据python中另一列的条件在两个日期之间查找特定列的最大值,python,Python,关于如何根据另一列的条件在两个日期之间查找特定列的最大值,我可以获得一些帮助吗 我有一个类似于下面的df,我需要在两行之间找到最大值,其中条件为-max value of['high']列,在同一['symbol']内['mark']列的2个'act'值之间,并将该值存储在一个新列中 i、 e.找出苹果在2021年3月4日至2021年3月9日之间的最高价格,因为这两个日期都在标记栏中起作用。[栏中标记了更多的'act',但由于空间限制,请在此共享一个简短版本] 2021年3月4日至2021年3月

关于如何根据另一列的条件在两个日期之间查找特定列的最大值,我可以获得一些帮助吗

我有一个类似于下面的df,我需要在两行之间找到最大值,其中条件为-max value of['high']列,在同一['symbol']内['mark']列的2个'act'值之间,并将该值存储在一个新列中

i、 e.找出苹果在2021年3月4日至2021年3月9日之间的最高价格,因为这两个日期都在标记栏中起作用。[栏中标记了更多的'act',但由于空间限制,请在此共享一个简短版本]

2021年3月4日至2021年3月10日期间橙色的情况类似

它不应该在09年对苹果的act标记进行计算,因为在那之后苹果就没有act了

数据:

日期 象征 打开 高的 低的 关 做记号 03/03/2021 苹果 732 754.95 723.4 729.85 04/03/2021 苹果 733.25 765.7 715.85 752.45 行为 05/03/2021 苹果 752.45 761 730.5 748.95 08/03/2021 苹果 762.7 767.8 744.2 748.4 09/03/2021 苹果 755.55 759.4 738.65 750.75 行为 10/03/2021 苹果 757.5 753.1 743 745.35 12/03/2021 苹果 743 752.1 723 728.15 15/03/2021 苹果 727.8 727.8 706.05 719.05 03/03/2021 橙色 2406 2417.7 2375.8 2402.1 04/03/2021 橙色 2380 2435 2350 2417.1 行为 05/03/2021 橙色 2399 2423.9 2377.1 2387.1 08/03/2021 橙色 2383 2413.5 2360.05 2382.7 09/03/2021 橙色 2400 2444 2396.15 2422.7 10/03/2021 橙色 2446 2446 2415.55 2431.95 行为 12/03/2021 橙色 2442.8 2464.65 2397 2401.35 15/03/2021 橙色 2402.55 2427.55 2343.05 2355
好的,我对此进行了尝试-首先,我重新创建了数据帧:

import pandas as pd

data={("03/03/2021","APPLE",732,754.95,723.4,729.85,), 
      ("04/03/2021","APPLE",733.25,765.7,715.85,752.45,"act"), 
      ("05/03/2021","APPLE",752.45,761,730.5,748.95,), 
      ("08/03/2021","APPLE",762.7,767.8,744.2,748.4,), 
      ("09/03/2021","APPLE",755.55,759.4,738.65,750.75,"act"), 
      ("10/03/2021","APPLE",757.5,753.1,743,745.35,), 
      ("12/03/2021","APPLE",743,752.1,723,728.15,), 
      ("15/03/2021","APPLE",727.8,727.8,706.05,719.05,), 
      ("03/03/2021","ORANGE",2406,2417.7,2375.8,2402.1,), 
      ("04/03/2021","ORANGE",2380,2435,2350,2417.1,"act"), 
      ("05/03/2021","ORANGE",2399,2423.9,2377.1,2387.1,), 
      ("08/03/2021","ORANGE",2383,2413.5,2360.05,2382.7,), 
      ("09/03/2021","ORANGE",2400,2444,2396.15,2422.7,), 
      ("10/03/2021","ORANGE",2446,2446,2415.55,2431.95,"act"), 
      ("12/03/2021","ORANGE",2442.8,2464.65,2397,2401.35,), 
      ("15/03/2021","ORANGE",2402.55,2427.55,2343.05,2355,)}

df = pd.DataFrame(data, 
                  columns=("date","symbol","open","high","low","close","mark")).
                  sort_values(by=["symbol", "date"]).fillna("").reset_index(drop=True)
我想你要做的是一个简单的分组最大值。棘手的部分是操纵数据,使其符合group by的预期。也就是说,要分组的字段

def block_diff(series, trigger, start_stop=False):
    toggle = False
    rs = list()
    for i,v in series.iteritems():
        if v==trigger:
            if start_stop and toggle:
                rs.append(toggle)
                toggle=not toggle
            elif start_stop and not toggle:
                toggle=not toggle
                rs.append(toggle)
            elif not start_stop:
                toggle=not toggle
                rs.append(toggle)
        else:
            rs.append(toggle)
    return pd.Series(rs)
因此,上面的函数被定义了——这里的想法是,我们希望通过以下方式来排除将在组中显示的区域。此函数接受一个系列、一些匹配的触发器值和一个开始\停止标志来微调行为

如果我将其应用于数据帧,使用返回的真/假值作为索引来填充分组变量的副本,并将结果存储在名为act_block的新字段中,那么我将创建一个唯一的分组字段,该字段也用作开始-停止过滤器。同时,我还创建了一个名为act_sequence的附加列,稍后我们将使用它来标识每个子组的初始起始行

df['act_block'] = df[block_diff(df['mark'], "act", True)]['symbol']
df['act_sequence'] = df.groupby("act_block").cumcount()
df

    date        symbol  open    high    low     close   mark    act_block   act_sequence
0   03/03/2021  APPLE   732.00  754.95  723.40  729.85          NaN         0
1   04/03/2021  APPLE   733.25  765.70  715.85  752.45  act     APPLE       0
2   05/03/2021  APPLE   752.45  761.00  730.50  748.95          APPLE       1
3   08/03/2021  APPLE   762.70  767.80  744.20  748.40          APPLE       2
4   09/03/2021  APPLE   755.55  759.40  738.65  750.75  act     APPLE       3
5   10/03/2021  APPLE   757.50  753.10  743.00  745.35          NaN         1
6   12/03/2021  APPLE   743.00  752.10  723.00  728.15          NaN         2
7   15/03/2021  APPLE   727.80  727.80  706.05  719.05          NaN         3
8   03/03/2021  ORANGE  2406.00 2417.70 2375.80 2402.10         NaN         4
9   04/03/2021  ORANGE  2380.00 2435.00 2350.00 2417.10 act     ORANGE      0
10  05/03/2021  ORANGE  2399.00 2423.90 2377.10 2387.10         ORANGE      1
11  08/03/2021  ORANGE  2383.00 2413.50 2360.05 2382.70         ORANGE      2
12  09/03/2021  ORANGE  2400.00 2444.00 2396.15 2422.70         ORANGE      3
13  10/03/2021  ORANGE  2446.00 2446.00 2415.55 2431.95 act     ORANGE      4
14  12/03/2021  ORANGE  2442.80 2464.65 2397.00 2401.35         NaN         5
15  15/03/2021  ORANGE  2402.55 2427.55 2343.05 2355.00         NaN         6
现在我们可以在act_块上执行一个简单的groupby,将结果保存到一个名为max_groups的系列中:

max_groups = df.groupby("act_block")["high"].max()


act_block
APPLE      767.8
ORANGE    2446.0
Name: high, dtype: float64
将此系列与原始数据帧合并—如果我们使用筛选器执行此操作,则max_vals对象将继承原始数据帧的索引,从而允许我们执行pd.concat以有选择地将两个对象连接在一起以生成预期的输出

max_vals = df.merge(max_groups, left_on=["act_block"], right_on="act_block",how="left")[(df['act_sequence']==0)].fillna("")['high_y']
max_vals.name="max_val"
new_df = pd.concat([df, max_vals], axis=1).fillna("")
new_df = new_df[["date","symbol","open","high","low","close","mark","max_val"]]

new_df
日期 象征 打开 高的 低的 关 做记号 最大值 0 03/03/2021 苹果 732 754.95 723.40 729.85 1. 04/03/2021 苹果 733.25 765.70 715.85 752.45 行为 767.8 2. 05/03/2021 苹果 752.45 761 730.50 748.95 3. 08/03/2021 苹果 762.70 767.80 744.20 748.40 4. 09/03/2021 苹果 755.55 759.40 738.65 750.75 行为 5. 10/03/2021 苹果 757.50 753.10 743 745.35 6. 12/03/2021 苹果 743 752.10 723 728.15 7. 15/03/2021 苹果 727.80 727.80 706.05 719.05 8. 03/03/2021 橙色 2406 2417.70 2375.80 2402.10 9 04/03/2021 橙色 2380 2435 2350 2417.10 行为 2446 10 05/03/2021 橙色 2399 2423.90 2377.10 2387.10 11 08/03/2021 橙色 2383 2413.50 2360.05 2382.70 12 09/03/2021 橙色 2400 2444 2396.15 2422.70 13 10/03/2021 橙色 2446 2446 2415.55 2431.95 行为 14 12/03/2021 橙色 2442.80 2464.65 2397 2401.35 15 15/03/2021 橙色 2402.55 2427.55 2343.05 2355
你在寻找什么样的答案,说你预计苹果在3月8日会达到767.8是正确的吗?您希望此数字在此数据帧的新列中位于何处,还是希望在本例中仅返回值2作为单独表的提取?谢谢您的提问。我预计苹果将在2021年3月4日这一行的新栏中出现767.8的高点。这是一个有趣的问题——到目前为止,你尝试了哪些东西,你在这里看到的是什么样的卷?几千行的解决方案可能与数百万行的解决方案有所不同。我尝试使用此链接中的信息,但并没有让我领先多少。数据的大小最多在100万到200万行之间。首先,非常感谢您为此抽出时间。由于我是一个初学者,我有点不知所措看这个,但我相信我将能够掌握这一点与一点时间。我确实看到您的输出结果正是我所需要的。再说一次,非常感谢你。好心的,不客气,我想是的 这是一个有趣的问题,因为它结合了3或4个操作,这些操作本身通常相对简单,但这个问题需要以一种有趣的方式将它们结合起来。在您尝试时,请查看中间数据帧/对象等,这将有助于了解每个阶段发生的情况。