熊猫:返回符合条件的第一列号

时间:2020-06-29 23:38:22

标签: python pandas

我有一个看起来像这样的数据框

    a     b     c     d
0  0.6  -0.4   0.2   0.7
1  0.8   0.2  -0.2   0.3
2 -0.1   0.5   0.5  -0.4
3  0.8  -0.6  -0.7  -0.2 

我希望创建列“ e”,使其在每行中显示值小于0的第一个实例的列号

因此目标结果将如下所示

    a     b     c     d    e
0  0.6  -0.4   0.2   0.7   2
1  0.8   0.2  -0.2   0.3   3
2 -0.1   0.5   0.5  -0.4   1
3  0.8  -0.6  -0.7  -0.2   2

我可以使用MATCH(True)类型的函数在Excel中完成此操作,但是在Pandas中却很难取得进展。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

您可以使用list

out <- vector('list', nrow(df))
prp <- names(df)[startsWith(names(df), "proportion")]
abn <- names(df)[startsWith(names(df), "abundance")]
for(i in seq_len(nrow(df)))  out[[i]] <- coef(lm(abundance ~ proportion,
   data.frame(abundance = unlist(df[i, abn]), proportion = unlist(df[i, prp]))))

df[c('slope', 'intercept')] <- do.call(rbind, out)[,2:1]
df[, c("slope", "intercept")]
#       slope intercept
#1 -1613.9597  313.7648
#2  -601.7193  241.6664
#3  -329.6502  215.6954

输出:

np.argmax

答案 1 :(得分:0)

类似idxminnp.sin

import numpy as np 
df['e']=df.columns.get_indexer(np.sign(df).idxmin(1))+1
df
     a    b    c    d  e
0  0.6 -0.4  0.2  0.7  2
1  0.8  0.2 -0.2  0.3  3
2 -0.1  0.5  0.5 -0.4  1
3  0.8 -0.6 -0.7 -0.2  2

答案 2 :(得分:0)

获取第一个最大值,并结合get indexer for以获得列号:

    df["e"] = df.columns.get_indexer_for(df.lt(0, axis=1).idxmax(axis=1).array) + 1
    df


     a  b       c    d      e
0   0.6  -0.4   0.2  0.7    2
1   0.8   0.2  -0.2  0.3    3
2  -0.1   0.5   0.5  -0.4   1
3   0.8  -0.6  -0.7 -0.2    2