Skip to main content
 首页 » 编程设计

python之在 Pandas 数据框中获得最小的一行

2025年05月04日29birdshome

我的数据框是这样的:

            A  B  C  D 
date                   
2015-01-01  1  1  2  3 
2015-01-02  1  2  3  3 
2015-01-03  1  2  1  3 
2015-01-04  3  2  1  1 
2015-01-05  3  2  2  1 
2015-01-06  1  1  2  3 
2015-01-07  1  2  3  3 
2015-01-08  1  2  1  3 
2015-01-09  3  2  1  1 
2015-01-10  3  2  2  1 
2015-01-11  3  2  2  1 

基本规则:我想确定每行的 2 个最小值并将这些值设置为 1。其他值应设置为 0。

附加规则:

1 1 1 1  should be 1 1 1 1 
1 2 2 2  should be 1 1 1 1 
1 2 2 3  should be 1 1 1 0 
1 2 3 4  should be 1 1 0 0 

我希望你能遵守规则,对于一开始的数据框,结果应该是

date        A   B   C   D 
2015-01-01  1   1   0   0 
2015-01-02  1   1   0   0 
2015-01-03  1   0   1   0 
2015-01-04  0   0   1   1 
2015-01-05  0   1   1   1 
2015-01-06  1   1   0   0 
2015-01-07  1   1   0   0 
2015-01-08  1   0   1   0 
2015-01-09  0   0   1   1 
2015-01-10  0   1   1   1 
2015-01-11  0   1   1   1 

编辑

“也许你想用 method='first' 排名,我认为这会起作用 – EdChum” 数据框的结果:

            A  B  C  D 
date                   
2015-01-01  1  2  3  4 
2015-01-02  1  2  3  4 
2015-01-03  1  3  2  4 
2015-01-04  4  3  1  2 
2015-01-05  4  2  3  1 
2015-01-06  1  2  3  4 
2015-01-07  1  2  3  4 
2015-01-08  1  3  2  4 
2015-01-09  4  3  1  2 
2015-01-10  4  2  3  1 
2015-01-11  4  2  3  1 

请您参考如下方法:

我认为这可以满足您的需求:

In [3]: 
mask = df.rank(method='dense', axis=1) <= 2 
df[mask] = 1 
df[~mask] = 0 
df 
 
Out[3]: 
            A  B  C  D 
date                   
2015-01-01  1  1  1  0 
2015-01-02  1  1  0  0 
2015-01-03  1  1  1  0 
2015-01-04  0  1  1  1 
2015-01-05  0  1  1  1 
2015-01-06  1  1  1  0 
2015-01-07  1  1  0  0 
2015-01-08  1  1  1  0 
2015-01-09  0  1  1  1 
2015-01-10  0  1  1  1 
2015-01-11  0  1  1  1 

这将返回一个 rank值的行和传递 method='dense' 将根据第一次看到该值进行排名,并在看到新组时增加 1,您可以更改 2 到任何 n 值,排名与行中的值是否为整数和顺序无关。