在Python中使用Numpy.Where和Pandas.Shift的if语句

时间:2019-12-11 17:47:11

标签: python-3.x numpy dataframe if-statement lambda

我有一个类似于下面的DataFrame。我正在尝试计算从False切换到True的滚动次数。

Time   True/False
 1         0
 2         1
 3         1
 4         0
 5         0
 6         0
 7         1
 8         1
 9         0
 10        1
 11        0

下面的代码是我使用```numpy.where想到的,但是我没有得到想要的结果。

Test['RollingCount'] = np.where(Test['True/False'] == 0, Test['RollingCount'].shift(1),
                       np.where((Test['True/False'] == 1) & (Test['True/False'].shift(1) == 1), Test['RollingCount'].shift(1),
                       np.where((Test['True/False'] == 1) & (Test['True/False'].shift(1) == 0), (Test['RollingCount'].shift(1) + 1),
                       np.where(Test['True/False'] == 1, 1, 0))))

以下是我要完成的输出。知道我在做什么错吗?有更好的方法来解决这个问题吗?

Time   True/False   RollingCount
 1         0              0
 2         1              1
 3         1              1
 4         0              1
 5         0              1
 6         0              1
 7         1              2
 8         1              2
 9         0              2
 10        1              3
 11        0              3

2 个答案:

答案 0 :(得分:1)

IIUC:

df['RollingCount'] = df['True/False'].diff(-1).eq(1).cumsum()

输出:

0     0
1     0
2     1
3     1
4     1
5     1
6     1
7     2
8     2
9     3
10    3
Name: True/False, dtype: int32

答案 1 :(得分:0)

在numpy中,您可以使用diffcumsum来做到这一点:

d = np.concatenate(([0], np.diff(tf)))
result = np.cumsum(d[d > 0])