[英]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=1
、 y=2
和k=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.