[英]Consecutive rows meeting a condition in pandas
我有一個像這樣的熊貓數據框:
col_name
0 -1
1 -1
2 -3
3 2
4 1
5 -3
6 -2
7 4
8 3
9 5
可以使用以下代碼創建:
import pandas as pd
df = pd.DataFrame(
{
'col_name': [-1, -1, -3, 2, 1, -3, -2, 4, 3, 5]
}
)
我想找到在它們之前的x
行和行本身具有正值的行和在這些x
行具有負值之前的y
行以及這些y
行的最后一行,實際上是在當前行具有最小值之前的y
行與之前的k
行相比。
因此,對於x=1
、 y=2
和k=2
,輸出為:
col_name
4 1
(索引 8 不在輸出中,因為即使它本身和它之前的一行具有正值,並且它們之前的兩行具有負值,但是具有負值的最后一行是索引 6,沒有最小值與之前的兩行相比。)
此外,我的首要任務是不對代碼使用任何 for 循環。
你對此有什么想法嗎?
您的解釋不是很清楚,因此我將在此處放置一個基本解決方案,您可以根據需要隨意修改。 應該不難調整。
我們可以通過移動系列和應用迭代蒙版來實現這一點。
首先,創建您的班次:
m = d.assign(**{f'col_name_shift_{i}': d.col_name.shift(i)
for i in range(1, x+y+1)})
請注意,這里的 for 循環非常小(僅 3 次迭代)。 這給出了:
col_name col_name_shift_1 col_name_shift_2 col_name_shift_3
0 -1 NaN NaN NaN
1 -1 -1.0 NaN NaN
2 -3 -1.0 -1.0 NaN
3 2 -3.0 -1.0 -1.0
4 1 2.0 -3.0 -1.0
5 -3 1.0 2.0 -3.0
6 -2 -3.0 1.0 2.0
7 4 -2.0 -3.0 1.0
8 3 4.0 -2.0 -3.0
9 5 3.0 4.0 -2.0
現在,只需逐行分析哪些行符合您的要求。
例如,
我想找到在它們之前的 x 行和行本身具有正值的行
m1 = m.iloc[:, range(x+1)] > 0
並且這些 x 行之前的 y 行具有負值
m2 = m.iloc[:, range(x+1, x+y+1)] < 0
並且這些 y 行的最后一行實際上是當前行之前的 y 行,與之前的 k 行相比具有最小值。
m3 = m.iloc[:, range(y+1, y+k)].gt(m.iloc[:, y], axis=0)
然后,你連接你所有的布爾系列,
mask = pd.concat([m1, m2, m3, axis=1)
並找到
df.loc[mask.all(1)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.