首页 > 解决方案 > Python,熊猫根据停止条件查找每行的长度

问题描述

我有一个数据集,其中 -1 表示我需要停止阅读的点。例如,数据集如下所示:

          0   1   2    3    4  5
0       58  68  58   59   -1 -1
1       59  69  59   -1   -1 -1
2       93  94  93   33   -1 -1
3       58  59  58   68   -1 -1
4       92  94  92   33   -1 -1

其中第 4 列的 -1 表示停止读取元素。

更准确地说,我想为所有行返回每行的长度(在出现 -1 之前存在多少元素)。

所以第一行的长度为4(4个元素直到-1)。第二行的长度为 3。第三行的长度为 4,依此类推。

为此,我认为我需要在 pandas 中获取每行出现第一个 -1 的索引的方法。

我如何在 pandas 中以一种很好的方式做这样的事情(所以要避免长 for 循环选项?)

我要提前感谢您的帮助。问候亚历克斯

标签: pythonpandasfind

解决方案


numpy.argmax

您可以将 DataFrame 值与 -1 进行比较,然后用于numpy.argmax获取每行非零值的数量。

(df.values == -1).argmax(axis=1)
# array([4, 3, 4, 4, 4])

分配这个回来,

df['num_vals'] = (df.values == -1).argmax(axis=1))
df

    0   1   2   3  4  5  num_vals
0  58  68  58  59 -1 -1         4
1  59  69  59  -1 -1 -1         3
2  93  94  93  33 -1 -1         4
3  58  59  58  68 -1 -1         4
4  92  94  92  33 -1 -1         4

这通过始终返回在每行中找到的第一个 -1 的列索引来工作,因此更通用。


.cumsum(axis=1)+.max(axis=1)

df['num_vals'] = (df != -1).cumsum(axis=1).max(axis=1)
df

    0   1   2   3  4  5  num_vals
0  58  68  58  59 -1 -1         4
1  59  69  59  -1 -1 -1         3
2  93  94  93  33 -1 -1         4
3  58  59  58  68 -1 -1         4
4  92  94  92  33 -1 -1         4

这假设您的 -1 值始终位于其各自行的末尾。


推荐阅读