我的数据框是这样的:
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 值,排名与行中的值是否为整数和顺序无关。
