我有一个在负值和正值之间摇摆的数据框.我要做的是找到最后一行的值,并返回它上面所有行的dataframe,直到符号从负变为正或反之亦然.

问题的一个例子是这样的

import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(-10,10,size=(100, 1)), columns=list('v'))

创建包含从-10到10的数字的数据帧.

我需要做的是找到"V"的最后一行,并返回它上面的所有行,直到它切换符号.运行这段代码会得到以下输出:

93,  3
94,  2
95,  0
96, -1
97, -7
98, -2

我试图获得的是包含第96-98行的新数据帧,并且不需要或切掉第95行以上的所有内容.

由于数据帧内的符号更改了如此多次,因此我在挑选数据帧结束前的最后一个更改时遇到了困难(第95行)

我try 了iloc.tail()的各种切片方法,但都没有成功.

df[(df['v'].tail() < 0).idxmin(): ]

是我得到的最接近的,但是它只返回前面的5个值,有时它可能需要多达20个索引才能改变符号.

我试过各种形式

data[: (df['v'].iloc[-1] < 0)]

但我似乎就是得不到我想要的东西.

一个很大的问题是数据集有数百行长,所以有太多的零或符号更改,当我只需要在最后一个符号更改后才需要数据时,我可以想到其他方法.

任何帮助将不胜感激.

推荐答案

Example Code

如果随机生成DataFrame,则必须提供种子.我将生成一个新的DataFrame作为示例,因为您没有提供种子.

import pandas as pd
df = pd.DataFrame([1, 2, 3, -4, 0, 1, 2] , columns=list('v'))

Df:

    v
0   1
1   2
2   3
3   -4
4   0
5   1
6   2

Code

s = df['v'].mask(df['v'].eq(0)).ffill()
grp = s.mul(s.shift()).le(0).cumsum()
out = df[grp.eq(grp.max())]

输出:

    v
5   1
6   2

Python相关问答推荐

Python中的嵌套Ruby哈希

更改键盘按钮进入'

NP.round解算数据后NP.unique

Polars:用氨纶的其他部分替换氨纶的部分

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

如何更改分组条形图中条形图的 colored颜色 ?

如何获得每个组的时间戳差异?

通过ManyToMany字段与Through在Django Admin中过滤

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

try 检索blob名称列表时出现错误填充错误""

如何在达到end_time时自动将状态字段从1更改为0

基于行条件计算(pandas)

numpy.unique如何消除重复列?

在代码执行后关闭ChromeDriver窗口

从源代码显示不同的输出(机器学习)(Python)

如何用FFT确定频变幅值

比较两个有条件的数据帧并删除所有不合格的数据帧

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

在Django REST框架中定义的URL获得404分

极地数据帧:ROLING_SUM向前看