假设我有这样一个Pandas 数据帧:

    first   second  third
1     2       2       1
2     2       1       0
3     3       4       5
4     4       6       3
5     5       4       3
6     8       8       4
7     3       4       2
8     5       6       6

可以使用以下代码创建:

dataframe = pd.DataFrame(
    {
        'first': [2, 2, 3, 4, 5, 8, 3, 5], 
        'second': [2, 1, 4, 6, 4, 8, 4, 6], 
        'third': [1, 0, 5, 3, 3, 4, 2, 6]
    }
)

我想 Select 第二列的值大于第一列的值的行,同时第三列中的值小于第二列中k个连续行的值,其中这k个连续行中的最后一行正好在第二列的值大于第一列的值的行之前,k可以是2到4之间的任意整数(闭合区间).

因此,输出应该是行:

为了在pandas中使用条件行 Select 获得上述结果,我知道我应该编写如下代码:

dataframe[(dataframe['first'] < dataframe['second']) & (second_condition)].index

但是我不知道为我上面解释过的second_condition人写些什么.有人能帮我吗?

推荐答案

这里的诀窍是计算布尔掩码上的rolling sum,以找出之前k行中third列小于second列的值的数量

k = 2
m1 = df['second'].gt(df['first'])
m2 = df['third'].lt(df['second']).shift(fill_value=0).rolling(k).sum().eq(k)

print(df[m1 & m2])

   first  second  third
3      3       4      5
7      3       4      2
8      5       6      6

Python相关问答推荐

未调用自定义JSON编码器

在Docker容器(Alpine)上运行的Python应用程序中读取. accdb数据库

polars:有效的方法来应用函数过滤列的字符串

当输入是字典时,`pandas. concat`如何工作?

为什么dict. items()可以快速查找?

Polars表达式无法访问中间列创建表达式

仅取消堆叠最后三列

Pandas:使列中的列表大小与另一列中的列表大小相同

大Pandas 中的群体交叉融合

Django查询集-排除True值

如何导入与我试图从该目录之外运行的文件位于同一目录中的Python文件?

安装PyTorch时出现CondaVerificationError

获取给出特定产品的所有可能组合的数量

将代码推送到服务器时,连接WebSocket时出错

我怎样才能用python打印一个 map 对象?

Python Scrapy Shell Error While Scraping Wallmart

使用Pandas 遍历词典

多索引数据帧:对每个组的值进行排序

使用Pandas DataFrame从CSV文件中获取特定值

解析类型的字符串表示形式以获取子项的类型