Pandas向前填充打破订单的列的部分

时间:2015-12-10 15:34:18

标签: python sorting pandas

我认为这很容易,但我想不出正确的方法。我基本上想要一个列从最小到最大排序,但我实际上并不想对它们进行排序,我想要替换排序中“错误”的值。 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

2 个答案:

答案 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