我有一个带有1(例如) (见截图)块的列的熊猫数据
我想创建另一列,它只在每个块的开头(第一个单元格)和结束(最后一个单元格)发出信号。因此,当0后面跟着1,1后面跟着0时,则为true。
例如,在一个值为[0,1,1,1,1,0]的列中,我希望获得另一列,如[0,1,0,0,1,0]。
我想我可以使用np.where,但是我不知道如何实现相应的条件。我试过这样做:df['output'] = np.where(df['signal'].rolling(2).mean() == 0.5, 1, 0) --它可以很好地向第一个单元发出信号,但是输出列中的信号与信号列相比移动了。
你能帮帮我吗?
提前感谢
发布于 2022-08-10 13:11:50
以下是单行解决方案:
import pandas as pd
import numpy as np
df = pd.DataFrame(data=[0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0], columns=['signal'])
# Solution
df['output'] = np.where((df['signal'].diff().eq(1)) | (df['signal'].diff().shift(-1) == -1), True, False)发布于 2022-08-10 13:07:20
您可以使用np.abs和np.diff的组合,并将结果转换为布尔数组。
例如,如果您的序列是x = [0,0,0,1,1,0,0]
diffs = np.diff(x) # has value [0,0,-1,0,1,0]
abs_diffs = np.abs(diffs) # has value [0,0,1,0,1,0]
boolean_array = abs_diffs == 1 # [False, False, True, False, True, False]注意,这个数组的长度比原始数组少一个,您需要确定序列对于列表中的第一个/最后一个元素意味着什么。
https://stackoverflow.com/questions/73306754
复制相似问题