Python搜索4列以非零值返回第一列中的所有非零值

时间:2018-08-01 12:45:31

标签: python pandas

我有一个这样的数据框:

|ID|Top|Bottom|Duration|TotalInj|PerMeterInj|Opt1|Opt2|Opt3|RefP|
-----------------------------------------------------------------
|1 |10 |5     |20      |23.8    |4.76       |0   |15  |0   |23  |
|1 |10 |5     |20      |23.8    |4.76       |0   |0   |10  |23  |
|1 |10 |5     |20      |23.8    |4.76       |24  |13  |0   |23  |
|1 |10 |5     |20      |23.8    |4.76       |22  |0   |12  |23  |
|1 |10 |5     |20      |23.8    |4.76       |25  |0   |0   |23  |

它需要遍历Opt1,Opt2和Opt3以找到第一个非零值,然后返回该列中的所有非零值,因此在此示例中,它将返回最后3行,并且仅返回Opt1:

|ID|Top|Bottom|Duration|TotalInj|PerMeterInj|Opt1|
--------------------------------------------------
|1 |10 |5     |20      |23.8    |4.76       |24  |
|1 |10 |5     |20      |23.8    |4.76       |22  |
|1 |10 |5     |20      |23.8    |4.76       |25  |

如果Opt1中的所有值均为零,则搜索Opt2列,依此类推。如果所有Opt1,2,3均为零,则返回带有RefP的行(始终不变)。

以前,我创建了一个仅包含最后4列的数据框,并使用ravel()函数仅查找了第一个非零值,但是现在我需要为具有非零值的第一列返回所有非零值。

1 个答案:

答案 0 :(得分:0)

这项工作可以吗?

def find_nonzeros():
    for i, col in enumerate(["Opt1", "Opt2", "Opt3"]):
        if df[col].nonzero(): #if there are any nonzero values
            return df.iloc[df[col].nonzero()[0], list(range(6)) + [6 + i]]
    return df.iloc[0, list(range(6)) + [len(df.columns)-1]]