簡體   English   中英

滿足熊貓條件的連續行

[英]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=1y=2k=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.

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