获取Pandas中最后一个非空值的索引

hmtdttj4  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(179)

让我们假设我有以下数据框:

x         y
1    -1.808909  0.093380
2     1.733595 -0.380938
3    -1.385898  0.714071

我想在“y”之后的列中插入一个值。但是,我可能会插入多个值。

因此,我需要检查“y”后面的单元格是否为空,以避免覆盖该单元格。

因此,预期输出可能如下所示

x         y      
1    -1.808909  0.093380   5
2     1.733595 -0.380938   6    7
3    -1.385898  0.714071   8

与上面的输入相比,我需要首先检查单元格是否为空。

我想我可以用:x = df.iloc[1,:].last_valid_index()

但该方法返回的是“y”,而不是“y”的索引1。

稍后,我将使用该索引插入“5”:

x +=1
df.iloc[1,x] = 5

我想使用这种方法来查找最后一个非空单元格,因为输出中有第二行。您可以看到,如果我总是使用相同的方法,则需要插入“6”,然后插入“7”:

df.iloc[1,2] = 6
    df.iloc[1,2] = 7

在插入“7”时会覆盖“6”

还有一件事,我不能使用类似:(df['y'].iloc[2]).index的内容来查找该值,因为稍后我将有两个“y”列,因此,这可能会导致返回的索引号小于所需的索引号。

wfsdck30

wfsdck301#

很容易识别数字数组或 Dataframe 中每一行的第一个零的位置。让我们创建一个在某个位置后带有零的 Dataframe :

df = pd.DataFrame(np.random.normal(size=(5, 10)))
df
0  1  2  3  4  5  6  7  8  9
0  4  1  4  2  6  0  0  0  0  0
1  5  4  9  5  5  4  0  0  0  0
2  6  6  6  5  4  8  6  0  0  0
3  5  3  9  5  3  9  6  3  0  0
4  3  2  7  9  7  6  6  7  5  0

例如,下面的代码将给出数据框中值为0的所有位置

np.argwhere(df.values == 0)
array([[0, 5],
       [0, 6],
       [0, 7],
       [0, 8],
       [0, 9],
       [1, 6],
       [1, 7],
       [1, 8],
       [1, 9],
       [2, 7],
       [2, 8],
       [2, 9],
       [3, 8],
       [3, 9],
       [4, 9]], dtype=int64)

或者,您可以获得值不为零的位置:

np.argwhere(df.values != 0)
array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 3],
       [0, 4],
       [1, 0],
       [1, 1],
       [1, 2],
       [1, 3],
       [1, 4],
       [1, 5],
       [2, 0],
       [2, 1],
       [2, 2],
       [2, 3],
       [2, 4],
       [2, 5],
       [2, 6],
       [3, 0],
       [3, 1],
       [3, 2],
       [3, 3],
       [3, 4],
       [3, 5],
       [3, 6],
       [3, 7],
       [4, 0],
       [4, 1],
       [4, 2],
       [4, 3],
       [4, 4],
       [4, 5],
       [4, 6],
       [4, 7],
       [4, 8]], dtype=int64)

我希望这会有帮助。

ne5o7dgx

ne5o7dgx2#

我建议这是一个不那么复杂的解决方案

import random
nums = [0, 7, 78, 843, 34893, 0 , 2, 23, 4, 0]
random.shuffle(nums)
thg = [x for x in nums if x != 0]
print(thg[0])

这样做的目的是洗牌“数字”列表,并过滤掉所有的零。然后,它打印第一个非零值

相关问题