python - python - 如何在整个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



时间:

下面是使用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



要查找最后一个非零:


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)



通过索引,最后一次转换为整数,可以将0转换为缺少的值,使用前向填充,并且选择最后一行:


df = df.mask(df==0).ffill().iloc[[-1]].astype(int)


print (df)


 A B


5 10 2



就像这样:


results = {}


for column in df.columns:


 results[column] = df.loc[df[column]!=0, column].iloc[-1]



这将创建一个包含所有列的字典,它们最后一个非零值作为值。


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



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


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)



使用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中的每个列,我们都希望,

  • 将该列反向迭代,例如,[0, 0, 10, 9, 0, 0]
  • 将所有零降到第一个非零元素,例如 [10, 9, 0, 0]
  • 获取迭代器中的下一个元素,例如,10

...