繁体   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