我还是直接回文好了。
※ 引述《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跟条件必须改
希望有帮上忙
版上前辈有没有更好的方法?