2015-12-10 38 views
2

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

回答

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 
+0

令人难以置信这是多么简单;-) +1 – EdChum

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 

UPDATE

您可以使用双方括号来强制在df上调用apply,这允许您按行进行操作,然后我们EA用户定义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 
+0

嘿,我做了一个文件编辑。数据框中可能存在重复的“错误”条目,我们在一行中出现多个错误的条目。我曾经想过shift()和diff(),但是意识到如果有多个,我不知道有多少个。 – user1610719

+0

这是正常的礼仪,完全陈述你的要求,而不是张贴一个基本的例子,然后发布一个编辑你的*真实*问题是什么,这浪费了每个人的时间,非常讨厌 – EdChum

+0

我明显忘了,并没有这样做故意地。不过,我很抱歉。 – user1610719