Python 计算数据帧中每行上的连续True数

Python 计算数据帧中每行上的连续True数,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,我试图计算每行上有多少个连续的True,我自己解决了这部分问题,但我需要为这部分找到一个解决方案:如果一行以FALSE开头,那么结果必须是0。下面是一个示例数据集。你能给我推荐你的解决方法吗 我最初的问题是在下面的链接 示例数据.csv文件 idx,预期结果,M_1,M_2,M_3,M_4,M_5,M_6,M_7,M_8,M_9,M_10,M_11,M_12 1001,0,假,假,假,真,真,假,假,假,假,假,假,假,假 1002,3,真,真,真,假,假,真,真,真,假,假,假 1003,1,

我试图计算每行上有多少个连续的True,我自己解决了这部分问题,但我需要为这部分找到一个解决方案:如果一行以FALSE开头,那么结果必须是0。下面是一个示例数据集。你能给我推荐你的解决方法吗

我最初的问题是在下面的链接

示例数据.csv文件 idx,预期结果,M_1,M_2,M_3,M_4,M_5,M_6,M_7,M_8,M_9,M_10,M_11,M_12 1001,0,假,假,假,真,真,假,假,假,假,假,假,假,假 1002,3,真,真,真,假,假,真,真,真,假,假,假 1003,1,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1004,4,真,真,真,假,假,假,假,假,假,假,假,假,假,假 1005,0,假,假,假,真,真,假,假,假,假,假,假,假,假,假 1006,0,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1007,0,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1008,1,真,假,假,真,假,假,假,假,假,假,假,假,假,假 1009,0,假,真,假,真,假,真,假,真,假,真,假,真,假,假 1010,1,真,假,真,假,真,假,真,假,真,假,真,假,真,假 1011,0,假,假,假,假,假,真,假,假,假,假,假,假,假,假 1013,0,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1014,1,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1015,1,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1016,0,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1017,2,真,真,假,假,假,假,假,假,假,假,假,假,假,假,假 1018,0,假,假,假,假,假,假,假,假,假,假,假,假,假,假,假 后约翰解决方案; 我怎样才能数清真相,直到我看到错误

结果=df。其中df[0],0 idx,M_1,M_2,M_3,M_4,M_5,M_6,M_7,M_8,M_9,M_10,M_11,M_12 1001,0,0,0,0,0,0,0,0,0,0,0,0 1002,真,真,真,假,假,真,真,真,假,假,假 1003,真,假,假,假,假,假,假,假,假,假,假,假,假,假 1004,真,真,真,假,假,假,假,假,假,假,假,假,假,假 1005,0,0,0,0,0,0,0,0,0,0,0,0 1006,0,0,0,0,0,0,0,0,0,0,0,0 1007,0,0,0,0,0,0,0,0,0,0,0,0 1008,真,假,假,真,假,假,假,假,假,假,假,假,假,假 1009,0,0,0,0,0,0,0,0,0,0,0,0 1010,真,假,真,假,真,假,真,假,真,假,真,假,真,假 1011,0,0,0,0,0,0,0,0,0,0,0,0 1013,0,0,0,0,0,0,0,0,0,0,0,0 1014,真,假,假,假,假,假,假,假,假,假,假,假,假,假 1015,真,假,假,假,假,假,假,假,假,假,假,假,假,假,假 1016,0,0,0,0,0,0,0,0,0,0,0,0 1017,真,真,假,假,假,假,假,假,假,假,假,假,假,假,假 1018,0,0,0,0,0,0,0,0,0,0,0,0 您可以使用np.argmin。您不需要预先筛选df,它将正确处理以False开头的行

df.loc[:, 'M_1':'M_12'].values.argmin(1)
#array([0, 3, 1, 4, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 2, 0])
请注意,这假设每行中至少有一个False。

您可以使用np.argmin。您不需要预先筛选df,它将正确处理以False开头的行

df.loc[:, 'M_1':'M_12'].values.argmin(1)
#array([0, 3, 1, 4, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 2, 0])
请注意,这假设每行中至少有一个False。

使用求反“~”反转列M-1-M-12的值。也就是说,真到假,反之亦然。执行cummax以分离第一组连续的True注释:此时True表示False值,“False”表示True值。对cummax的结果进行另一次否定,最后求和

使用求反“~”反转列M-1-M-12的值。也就是说,真到假,反之亦然。执行cummax以分离第一组连续的True注释:此时True表示False值,“False”表示True值。对cummax的结果进行另一次否定,最后求和


为什么第一行应为0?当它有3个TRUE时?idx=1001以FALSE开头,因此它可以是0。如果以FALSE开头,则True的数目从来都不重要。那么对于具有两组连续True的行?这个例子的数字是多少?应该是3。我们应该计算正确直到第一个错误。T、 T,T,F,停下来。我们应该看到3。如果以False、F、T、T开头。。。。。不知道。我们应该看到0。为什么第一行应该是0?当它有3个TRUE时?idx=1001以FALSE开头,因此它可以是0。如果以FALSE开头,则True的数目从来都不重要。那么对于具有两组连续True的行?这个例子的数字是多少?应该是3。我们应该计算正确直到第一个错误。T、 T,T,F,停下来。我们应该看到3。如果以False、F、T、T开头。。。。。不知道。我们应该看到0。
(~(~df.drop(['idx'], 1)).cummax(1)).sum(1)


Out[503]:
0     0
1     3
2     1
3     4
4     0
5     0
6     0
7     1
8     0
9     1
10    0
11    0
12    1
13    1
14    0
15    2
16    0
dtype: int64