我有一个这样的数据框:
|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()函数仅查找了第一个非零值,但是现在我需要为具有非零值的第一列返回所有非零值。>
答案 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]]