如果你需要apply函数roundPartial和arguments,你可以使用lambda:
def roundPartial (value, resolution):
return round (value / resolution) * resolution
print (df[['B', 'C']].apply(lambda x: roundPartial(x, 0.25)))
B C
0 0.50 1.25
1 -1.25 1.00
2 1.50 1.00
3 -0.25 -2.00
4 -0.75 -0.25
5 1.00 0.00
6 0.75 0.50
7 -0.75 0.25
8 0.00 1.25
9 -2.25 -1.50
round 的另一个解决方案:
print (df[['B', 'C']].apply(lambda x: (x / 0.25).round()* 0.25))
B C
0 0.50 1.25
1 -1.25 1.00
2 1.50 1.00
3 -0.25 -2.00
4 -0.75 -0.25
5 1.00 0.00
6 0.75 0.50
7 -0.75 0.25
8 0.00 1.25
9 -2.25 -1.50
但是较大的DataFrame 中最快的不是使用apply,你可以除以div 所有DataFrame 除以resolution 和乘以mul:
resolution = 0.25
print ((df[['B', 'C']].div(resolution)).round().mul(resolution))
#print ((df[['B', 'C']] / resolution).round() * resolution)
B C
0 0.50 1.25
1 -1.25 1.00
2 1.50 1.00
3 -0.25 -2.00
4 -0.75 -0.25
5 1.00 0.00
6 0.75 0.50
7 -0.75 0.25
8 0.00 1.25
9 -2.25 -1.50
时间安排:len(df)=100k:
df = pd.concat([df]*10000).reset_index(drop=True)
In [125]: %timeit (df[['B', 'C']].apply(lambda x: (x / resolution).round()* resolution))
10 loops, best of 3: 29 ms per loop
In [126]: %timeit ((df[['B', 'C']] / resolution).round() * resolution)
10 loops, best of 3: 22.5 ms per loop
In [127]: %timeit ((df[['B', 'C']].div(resolution)).round().mul(resolution))
10 loops, best of 3: 22.6 ms per loop