2016-05-20 5 views
2

は、最寄りの0.25に列B、Cを丸くする方法パンダのデータフレームを端数に丸める方法は?

np.random.seed(1234) 
df = pd.DataFrame({'A' : range(10), 'B' : np.random.randn(10), 'C' : np.random.randn(10)}) 

を考えます。

def roundPartial (value, resolution): 
    return round (value/resolution) * resolution 
df[['B', 'C']].apply(roundPartial, 0.25) 

しかし、私は得る:これは私が試したものです

ValueError: No axis named 0.25 for object type <class 'pandas.core.frame.DataFrame'> 

答えて

2

あなたは、あなたがlambdaを使用することができますargumentsapply機能roundPartialが必要な場合:

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大きな最速は、あなたがmulによってresolutionと複数でdivすべてDataFrameによって分割することができ、apply使用されていません。

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 
関連する問題