2015-12-10 43 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