假设我有这样一只熊猫:
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]
}
)我希望选择第二列的值大于第一列的值的行,同时,对于k连续行,第三列中的值小于第二列中的值,其中这些k连续行的最后一行正好在第二列的值大于第一列的值的行之前,而k可以是介于2到4之间的任何整数(封闭间隔)。
因此,输出应该是行:3, 7, 8
为了获得上述结果,在熊猫中使用条件行选择,我知道我应该编写如下代码:
dataframe[(dataframe['first'] < dataframe['second']) & (second_condition)].index但是我不知道该为second_condition写什么,我前面已经解释过了。有人能帮我吗?
发布于 2022-07-15 14:11:33
我将把我的答案集中在你问题的第二部分。您需要使用shift函数进行比较。它允许您移动行。
假设您的k固定在2,您应该这样做:
import pandas as pd
df = 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]
}
)
# this is the line
df[(df['third'] < df['second'].shift(1)) & (df['third'] < df['second'].shift(2))]到底怎么回事?
通过移动一行,开始将'third'与以前的'second'值进行比较,然后在第二个条件下将其移到两个位置。
注意,这只适用于k的固定值。如果k是可变的呢?
在这种情况下,您需要动态地编写条件。下面的代码假设,对于1,k中的n 的所有值,必须满足的条件。
k = 2 # pick any k > 1
df[~pd.concat([df['third'] < df['second'].shift(n) for n in range(1, k+1)]).any(level=0)].index这是怎么回事?:长话短说
首先,我们使用shift技巧进行检查,这是对1,k中的每一个n值都符合条件的行。
In [1]: [df['third'] < df['second'].shift(n) for n in range(1, k+1)]
out[1]:
[0 False
1 True
2 False
3 True
4 True
5 False
6 True
7 False
dtype: bool,
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 True
dtype: bool]然后,我们将它们连接起来,创建一个单一的dataframe,并为每个k值设置一个列。
In [2]: pd.concat([df['third'] < df['second'].shift(n) for n in range(1, k+1)])
Out[2]:
0 False
1 True
2 False
3 True
4 True
5 False
6 True
7 False
0 False
1 False
2 False
3 False
4 True
5 True
6 True
7 True
dtype: bool最后,我们选择使用符合任何列(即n的值)标准的所有行作为索引。因此:如果对任何n都是正确的,我们将返回它:
In [3]: pd.concat([df['third'] < df['second'].shift(n) for n in range(1, k+1)]).any(level=0)
Out[3]:
0 False
1 True
2 False
3 True
4 True
5 True
6 True
7 True
dtype: bool然后,您所需要做的就是对原始数据进行投影并获取索引。
In [3]: df[~pd.concat([df['third'] < df['second'].shift(n) for n in range(1, k+1)]).any(level=0)].index
Out[3]: Int64Index([0, 2], dtype='int64')最后注
如果必须满足所有值n in 1,k的条件,则将.any替换为.all。
https://stackoverflow.com/questions/72994967
复制相似问题