【问题标题】:Consecutive rows meeting a condition in pandas满足熊猫条件的连续行
【发布时间】:2022-07-22 22:39:18
【问题描述】:

我有一个这样的熊猫数据框:

    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 行之前的行和行本身具有正值和 y 行之前的行 x 行具有负值以及这些 y 行的最后一行是实际上,当前行之前的y 行与之前的k 行相比具有最小值。

因此,对于 x=1y=2k=2,输出为:

    col_name
4       1

(索引 8 不在输出中,因为即使它本身和它之前的一行具有正值,并且它们之前的两行具有负值,但是具有负值的最后一行是索引 6,没有与自身前两行相比的最小值。)

另外,我的首要任务是不对代码使用任何 for 循环。

你对此有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您的解释不是很清楚,所以我将在此处放置一个基本解决方案,您可以根据自己的需要随意修改。应该不难调整。

    我们可以通过移动系列和应用迭代蒙版来实现。

    首先,创建您的班次:

    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(1, k)].gt(m.iloc[:, y], axis=0)
    

    然后,您连接所有布尔系列,

    mask = pd.concat([m1, m2, m3, axis=1)
    

    找到

    df.loc[mask.all(1)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      相关资源
      最近更新 更多