Re: [問題] pandas修正數據問題

作者: fischcheng (布阿送)   2018-09-02 08:55:39
我還是直接回文好了。
※ 引述《bigbigcc (大大)》之銘言:
: 最近在學python 現在想利用pandas進行數據清理異常值
: 想說讓兩個row之間的值不要差距太大如果差太多就跟前一個相同
: df內為
: a b
: 0 1 1
: 1 2 2
: 2 3 4
: 3 4 9
: 4 5 8
: 5 6 5
: 6 7 7
: 7 8 8
: 8 9 9
: 9 10 10
: 主要的程式碼如下
: data = df['b']
: def new(data):
: for i in range(0, 10):
: row = df['b'][i]
: row1 = df['b'][i + 1]
: if row1 - row > 2:
: return row
: else:
: return row1
除了map的用法之外,這個函數有個問題
就是你在i=0的時候就已經return了,而且根本沒有用到data,
而你在函數裡面直接用df['b']
就算是i=0 new會回傳的是row1 就是df['b'][1] 等於2
也就是為什麼你的new 那一欄全部都是2,因為每次叫new函數都回傳2
再者,這個函數在i=9會出錯,因為df['b'][10]超出範圍了
: df['new'] = df['b'].map(new)
: 實際輸出結果為
: a b new 本來認為會有的結果
: 0 1 1 2 1
: 1 2 2 2 2
: 2 3 4 2 4
: 3 4 9 2 4
: 4 5 8 2 4
: 5 6 5 2 5
: 6 7 7 2 7
: 7 8 8 2 8
: 8 9 9 2 9
: 9 10 10 2 10
: 想請問各位版友是我邏輯上還是函式使用上有哪邊誤解了嗎?
疑問:
你b[3],b[4]變小是那邊是刻意的嗎?
"想說讓兩個row之間的值不要差距太大如果差太多就跟前一個相同"
那8-9沒有符合你的row1-row >2的條件,為什麼要改成4?
我覺得比較清楚的方法是,用df['b'].diff找出每個跟前一個的差別
設定好條件,然後再去建立新的Series/Column
或是你可以用for loop去搞(跟你本來定義的函數類似)
可是range跟條件必須改
希望有幫上忙
版上前輩有沒有更好的方法?
作者: bigbigcc (大基基)   2018-09-03 00:16:00
因為我本來是想說b[3]檢查過後就讓他變為4 然後b[4]在跟b[3]比所以也變成4

Links booklink

Contact Us: admin [ a t ] ucptt.com