我认为这很容易,但我想不出正确的方法。我基本上想要一个列从最小到最大排序,但我实际上并不想对它们进行排序,我想要替换排序中“错误”的值。 DataFrame已按需要排序,我只需要替换这个'id'列有错误的值。
最好的理解方式就是一个例子:
In [98]: d = pd.DataFrame.from_dict({1: {'id': 2}, 2: {'id': 2}, 3: {'id': 3}, 4: {'id':3}, 5: {'id':2}, 6: {'id': 2}, 7: {'id': 4}, 8: {'id': 5}, 9: {'id': 4}, 10: {'id': 6}}, orient='index')
In [99]: d
Out[99]:
id
1 2
2 2
3 3
4 3
5 2
6 2
7 4
8 5
9 4
10 6
现在你可以看到这不是很有序。我希望输出的是:
Out[101]:
id
1 2
2 2
3 3
4 3
5 3
6 3
7 4
8 5
9 5
10 6
答案 0 :(得分:4)
IIUC,您是不是只想查找累计最大值?
>>> d["fixed_id"] = d["id"].cummax()
>>> d
id fixed_id
1 2 2
2 2 2
3 3 3
4 3 3
5 2 3
6 2 3
7 4 4
8 5 5
9 4 5
10 6 6
答案 1 :(得分:1)
您可以使用diff
查找值不相等或增加的位置,将其设置为NaN
然后调用ffill
:
In [252]:
d.loc[d['id'].diff() < 0, 'id'] = np.NaN
d['id'] = d['id'].ffill()
d
Out[252]:
id
1 2
2 2
3 3
4 3
5 3
6 4
7 4
8 5
9 5
10 6
<强>更新强>
您可以使用双方括号来强制在apply
上调用df
,这允许您按行操作,然后使用用户定义的func将当前行值与所有行进行比较当前行之前的值,这会生成一个布尔掩码来选择无效行,并为这些行分配NaN
,然后ffill
:
In [293]:
def func(x):
return (d['id'].iloc[0:x.name] > x[0]).any()
d.loc[d[['id']].apply(func, axis=1), 'id'] = np.NaN
d['id'] = d['id'].ffill()
d
Out[293]:
id
1 2
2 2
3 3
4 3
5 3
6 3
7 4
8 5
9 5
10 6