Pandas用值列表替换最小值 - rowise

时间:2017-11-20 20:33:23

标签: python pandas dataframe

我有一个数据框,其中包含所有列中的数字。我想找到每列的最小值,并用给定的值集替换它们。我用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

2 个答案:

答案 0 :(得分:5)

使用maskeqmul

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