下面是一个数据框,在列“ID”中有两组值A和B。需要从相同列'MT' & 'Price'中的先前行中找到最小值,如果存在比当前价格值更大的价格值,则循环应中断并对以下行执行此条件。匹配的条件值需要填充在不同的列中,示例输出如下所示,
Python
df = {'ID': ['A', 'A', 'A', 'A','A','A','B', 'B', 'B', 'B','B','B'],
'Date': ['01-05-2023','02-05-2023', '03-05-2023', '04-05-2023', '06-05-2023','07-05-2023','01-05-2023','02-05-2023', '03-05-2023', '04-05-2023', '06-05-2023','07-05-2023'],
'MT': [2, 5, 10, 15, 20, 30,2, 5, 10, 15, 20, 30],
'Price': [300, 100.5, 200, 150.35, 250, 90,300, 100.5, 200, 150.35, 250, 90,]}
df = pd.DataFrame(data)
print(df)
Available Data frame:
*******************
ID Date MT Price
0 A 01-05-2023 2 300.00
1 A 02-05-2023 5 100.50
2 A 03-05-2023 10 200.00
3 A 04-05-2023 15 150.35
4 A 06-05-2023 20 250.00
5 A 07-05-2023 30 90.00
6 B 01-05-2023 2 300.00
7 B 02-05-2023 5 100.50
8 B 03-05-2023 10 200.00
9 B 04-05-2023 15 150.35
10 B 06-05-2023 20 250.00
11 B 07-05-2023 30 90.00
Output Required:
*******************
ID Date MT Price Matched_Price Date_Values
0 A 01-05-2023 2 300
1 A 02-05-2023 5 100.5
2 A 03-05-2023 10 200 100.5 02-05-2023
3 A 04-05-2023 15 150.35
4 A 06-05-2023 20 250 100.5,200,150.35 02-05-2023,03-05-2023,04-05-2023
5 A 07-05-2023 30 90
6 B 01-05-2023 2 300
7 B 02-05-2023 5 100.5
8 B 03-05-2023 10 200 100.5 02-05-2023
9 B 04-05-2023 15 150.35
10 B 06-05-2023 20 250 100.5,200,150.35 02-05-2023,03-
05-2023,04-05-2023
11 B 07-05-2023 30 90
下面提供的代码在识别列中的所有较小值时工作良好,但是需要应用条件的第二部分,即,如果存在比当前价格值更大的价格值,则循环应该中断并对以下行执行该条件。
for i,row in df.iterrows():dfa = df.iloc[:i,:] # slice with rows above current dfa = dfa[(dfa.ID==row.ID)&(dfa.MT < row.MT)&(dfa.Price< row.Price)] # matched rows df.loc[i,'matched_Price'] = ','. join(map(str,dfa.Price))df.loc[i,'matched_dates'] = ','. join(map(str,dfa.Date))
2条答案
按热度按时间ne5o7dgx1#
为了满足您的要求,我建议稍微修改您现有的代码。您需要确保一旦发现价格高于当前行的行,就停止考虑以前的行。这可以通过在切片之前按'Price'列以降序对DataFrame进行排序来实现,然后一旦遇到更高的价格就中断循环。
以下是Python中的完整答案:
这段代码的工作方式是遍历dataframe中的每一行,过滤当前行之上且具有相同ID的行。对于这些行中的每一行,如果“MT”值小于当前行并且“Price”值小于当前行,则这些值将添加到临时列表中。如果找到大于当前行的“Price”值,则循环中断,并且临时列表被追加到匹配的列表。在处理完所有行之后,将匹配的列表添加到 Dataframe 中。
ovfsdjhp2#
我通常更喜欢在
.apply()
函数中执行这些操作,而不是在循环中执行。使用循环并没有错,但我发现它会使pandas world中的事情更难处理。它通常也比使用apply或其他更好的矢量化解决方案慢。这是我的想法:
我还将值放入列表而不是逗号分隔的字符串中,但您可以使用此函数轻松转换这些列:
希望这有帮助!