我有一个看起来像这样的数据框
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中却很难取得进展。
感谢您的帮助
答案 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)
类似idxmin
和np.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