gpt4 book ai didi

python-3.x - Dataframe序列检测: Find groups where three rows in a row have negative values

转载 作者:行者123 更新时间:2023-12-01 10:17:00 26 4
gpt4 key购买 nike

假设我有一列 df['test']:

-1、-2、-3、2、-4、3、-5、-4、-3、-7

所以我想过滤掉连续至少三个负值的组。所以

groups = my_grouping_function_by_sequence()
groups[0] = [-1,-2-3]
groups[1] = [-5,-4,-3,-7]

是否有一些预定义的检查来测试 pandas 的数值数据中的序列?它不需要是 Pandas ,但我正在寻找一种快速且适应性强的解决方案。任何意见将是有益的。谢谢!

最佳答案

使用 GroupBycumsum 创建连续负数组。

grps = df['test'].gt(0).cumsum()
dfs = [d.dropna() for _, d in df.mask(df['test'].gt(0)).groupby(grps) if d.shape[0] >= 3]

输出

for df in dfs:
print(df)

test
0 -1.0
1 -2.0
2 -3.0
test
6 -5.0
7 -4.0
8 -3.0
9 -7.0

解释

让我们一步一步来:第一行,为连续的负数创建组

print(grps)
0 0
1 0
2 0
3 1
4 1
5 2
6 2
7 2
8 2
9 2
Name: test, dtype: int32

但正如我们所见,它还包括我们不想在输出中考虑的正数。所以我们使用 DataFrame.mask 将这些值转换为 NaN:

df.mask(df['test'].gt(0))
# same as df.mask(df['test'] > 0)

test
0 -1.0
1 -2.0
2 -3.0
3 NaN
4 -4.0
5 NaN
6 -5.0
7 -4.0
8 -3.0
9 -7.0

然后我们在这个数据框上分组,只保留 >= 3 行的组:

for _, d in df.mask(df['test'].gt(0)).groupby(grps):
if d.shape[0] >= 3:
print(d.dropna())

test
0 -1.0
1 -2.0
2 -3.0
test
6 -5.0
7 -4.0
8 -3.0
9 -7.0

关于python-3.x - Dataframe序列检测: Find groups where three rows in a row have negative values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60678789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com