我有一个数据框,其中包含所有列中的数字。我想找到每列的最小值,并用给定的值集替换它们。我用iloc尝试了idxmin,但没有运气,可能是我以错误的方式使用它们。任何帮助表示赞赏。
df = abs(pd.DataFrame(np.random.randn(4, 4)))
print (df)
print (df[df!=0].min(axis=0))
newvalues =[1,2,3,4]
让我们说输入是
0 1 2 3
0 2.776975 1.433614 0.147925 0.032635
1 1.328099 0.050764 0.255676 0.360205
2 0.614594 0.547384 0.791848 0.340333
3 1.475486 0.114053 0.904416 0.060585
预期输出
0 1 2 3
0 2.776975 1.433614 3 4
1 1.328099 2 0.255676 0.360205
2 1 0.547384 0.791848 0.340333
3 1.475486 0.114053 0.904416 0.060585
答案 0 :(得分:5)
使用mask
,eq
,mul
df.mask(df.eq(df.min(0),1),df.eq(df.min(0),1).mul([1,2,3,4]))
Out[41]:
0 1 2 3
0 2.776975 1.433614 3.000000 4.000000
1 1.328099 2.000000 0.255676 0.360205
2 1.000000 0.547384 0.791848 0.340333
3 1.475486 0.114053 0.904416 0.060585
或np.putmask
v=df.values
np.putmask(v, v==np.min(v,0), [1,2,3,4])
df
Out[72]:
0 1 2 3
0 2.776975 1.433614 3.000000 4.000000
1 1.328099 2.000000 0.255676 0.360205
2 1.000000 0.547384 0.791848 0.340333
3 1.475486 0.114053 0.904416 0.060585
答案 1 :(得分:4)
您可以为df.values
分配值,这应该非常快。
v = df.values
v[v.argmin(0), np.arange(len(v))] = newvalues
df[:] = v
df
0 1 2 3
0 2.776975 1.433614 3.000000 4.000000
1 1.328099 2.000000 0.255676 0.360205
2 1.000000 0.547384 0.791848 0.340333
3 1.475486 0.114053 0.904416 0.060585