如何在整个数据帧的每一列中找到最后一个非零元素?

时间:2019-06-19 11:08:10

标签: python pandas dataframe

如何找到数据帧每一列中最后出现的非零元素?

输入

    A  B
0   0  1
1   0  2
2   9  0
3  10  0
4   0  0
5   0  0

输出

    A  B
0  10  2

5 个答案:

答案 0 :(得分:11)

您可以将0转换为缺失值,使用正向填充并通过索引选择最后一行,最后将其转换为整数:

df = df.mask(df==0).ffill().iloc[[-1]].astype(int)
print (df)
    A  B
5  10  2

答案 1 :(得分:7)

这是使用ndarray.argmax和高级索引的一种方法:

first_max = df.values[df.ne(0).values.argmax(0), range(df.shape[1])]
out = pd.DataFrame([first_max], columns=df.columns)

df = pd.DataFrame({'A': [0,0,0,10,0,0] , 'B': [0,2,0,0,0,0]})

first_max = df.values[df.ne(0).values.argmax(0), range(df.shape[1])]
# array([10,  2])
pd.DataFrame([first_max], columns=df.columns)

    A  B
0  10  2

更新

为了找到 last 非零值:

row_ix = df.shape[0]-df.ne(0).values[::-1].argmax(0)-1
first_max = df.values[row_ix, range(df.shape[1])]
out = pd.DataFrame([first_max], columns=df.columns)

答案 2 :(得分:2)

类似的东西:

results = {}
for column in df.columns:
    results[column] = df.loc[df[column]!=0, column].iloc[-1]

这将创建一个字典,其中所有列均作为键,并且它们最后的非零值作为值。

编辑: 如果您希望在数据框中添加它,则需要对单行代码进行dict理解:

results = pd.DataFrame({column:[df.loc[df[column]!=0, column].iloc[-1]] for column in df.columns})

答案 3 :(得分:2)

在列上然后在行上循环并存储最后一个非零变量

list = []* number_of_columns
for i in range(len(df)):
    dfcolumn = df[:,i]
    for item in dfcolumn:
        if item !=  0:
            list[i] = [i, item]

print(list)

答案 4 :(得分:0)

使用itertools.dropwhile

给出

import itertools as it

import pandas as pd


df = pd.DataFrame(
    {"A": [0, 0, 9, 10, 0, 0], 
     "B": [1, 2, 0, 0, 0, 0]}
)

代码

#3                 2                 1 
[next(it.dropwhile(lambda x: x == 0, reversed(col))) for _, col in df.iteritems()]

输出

[10, 2]

详细信息

对于DataFrame中的每一列,我们想要

  1. 以相反的顺序重复该列,例如[0, 0, 10, 9, 0, 0]
  2. 将所有零放到第一个非零元素,例如[10, 9, 0, 0]
  3. 从迭代器中获取下一个元素,例如10