假设我有以下数据框:
df = pd.DataFrame({'a': [10, 20, 30, 40, 50], 'b': [0, 10, 40, 45, 50]}, columns = ['a', 'b'])
我想制作一个索引列表,其中:
a [i - 1] < b[i] and a[i] >= b[i]
为了检测时间序列中的一个值何时与另一个值交叉
是否有一种 Pandas 惯用的方法可以实现此目的,而无需迭代所有元素?
我尝试通过这样做创建一个带有标志的新列来指示交叉:
df['t'] = (df['a'].shift(1).values < df['b'].values and di['a'].values >= df['b']).astype(bool)
但这不会编译。我不知道如何解决这个问题,除非循环遍历所有元素。
最佳答案
您可以使用 Series.shift
与 Series.lt
这是“小于”,与 <
相同和 Series.ge
这是“大于或等于”并且与 >=
相同:
mask = df['a'].shift().lt(df['b']) & df['a'].ge(df['b'])
# same as (df['A'].shift() < df['b']) & (df['a'] >= df['b'])
0 False
1 False
2 False
3 False
4 True
dtype: bool
注意,我们不必指定 astype(bool)
, pandas 与 boolean indexing
一起工作并返回booleans
定义条件时。
获取indices
True
的行数,使用:
idx = df[mask].index.tolist()
print(idx)
[4]
关于python - 检测 Pandas 中列之间的值交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399896/