Python 返回panda df中的最后一个非零值
我有一个数据帧Python 返回panda df中的最后一个非零值,python,pandas,Python,Pandas,我有一个数据帧 col0 col1 col2 col3 col4 0 1 3 6 6 0 1 0 2 8 7 3 2 0 0 4 3 4 3 4 2 2 0 4 逻辑是如果col1不为零,则返回col1。如果列1为零,则返回列2(非零)。如果col 2为零,则返回col3。我们不需要为col4做任何事 我的代码如下所示,但它只返回col1 def test(df): if df['col1'].iloc
col0 col1 col2 col3 col4
0 1 3 6 6 0
1 0 2 8 7 3
2 0 0 4 3 4
3 4 2 2 0 4
逻辑是如果col1不为零,则返回col1。如果列1为零,则返回列2(非零)。如果col 2为零,则返回col3。我们不需要为col4做任何事
我的代码如下所示,但它只返回col1
def test(df):
if df['col1'].iloc[0] > 0:
return df['col1']
elif df['col1'].iloc[0] == 0 & df['col2'].iloc[0] > 0:
return df['col2']
elif df['col2'].iloc[0] == 0 & df['col3'].iloc[0] > 0:
return df['col3']
else:
return 0
test(new)
我试过了.any()和.all(),它也不起作用。另外,还有什么方法可以使这段代码更高效吗?是@ALollz idea的一个变体,因为它在pandas 1.2.0中被弃用:
indices = np.argmax(df.ne(0).values, axis=1)
print(df.values[np.arange(len(df)), indices])
输出
[1 2 4 4]
更新
要排除最后一列并返回0,请改为执行以下操作:
indices = np.argmax(df.ne(0).iloc[:, :-1].values, axis=1)
result = np.where(df.ne(0).iloc[:, :-1].any(1), df.values[np.arange(len(df)), indices], 0)
print(result)
对不起,我的不好,这应该有一个列4,我们不使用。在这种情况下,len(df)可能无法工作。还有别的办法解决这个问题吗。我更新了question@codelearner0504我不明白,len(df)给出了行数。这也适用于新输入