如何根据python中另一列的条件在两个日期之间查找特定列的最大值
关于如何根据另一列的条件在两个日期之间查找特定列的最大值,我可以获得一些帮助吗 我有一个类似于下面的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如何根据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月
好的,我对此进行了尝试-首先,我重新创建了数据帧:
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个操作,这些操作本身通常相对简单,但这个问题需要以一种有趣的方式将它们结合起来。在您尝试时,请查看中间数据帧/对象等,这将有助于了解每个阶段发生的情况。