2017-06-08 9 views
3

私は正と負の両方の3次元根を取る方法を理解しています。しかし、データフレームのすべての要素を効率的に処理するためにapply - lambdaメソッドを使用しようとすると、あいまいな問題が発生します。興味深いことに、このエラーは等式で発生していないので、私はコードで間違って何ができるか疑問に思って:パンダのデータフレームのキュービックルート

sample[columns]=sample[columns].apply(lambda x: (-1)*np.power(-x,1./3) if x<0 else np.power(x,1./3)) 
+0

エラーを再現する作業例も提供できますか?サンプルで試してみましたが、うまくいきました。 – Tbaki

答えて

4

に見えます名前。変数名が複数のため、末尾にsがあるため、これを仮定します。この場合、sample[columns]はデータフレームです。これは問題です。applyが各列を反復し、その列をlambdaに渡してapplyに渡したためです。だから、

(-1) * np.power(-series_object, -1./3) if series_object < 0 else... 

を取得し、それはあなたがゼロより小さいというシリーズ全体のtruthinessを求めているので、物事をめちゃくちゃにされてseries_object < 0です。

f = lambda x: -np.power(-x, 1./3) if x < 0 else np.power(x, 1./3) 
sample[columns] = sample[columns].applymap(f) 


applymap

f = lambda x: np.sign(x) * np.power(abs(x), 1./3) 

を次のように私は、あなたが全体のデータフレーム上でこれを実行する可能性が定義されてlambdaを使用したい、と述べたこと

平等

df.applymap(f).equals(f(df)) 

True 

とそのfasteため

df.applymap(f) 

      0   1   2   3   4 
0 1.817121 1.000000 -2.000000 0.000000 1.709976 
1 1.442250 1.000000 1.442250 2.080084 -1.259921 
2 -2.154435 1.259921 -2.154435 -2.000000 -2.154435 
3 -1.442250 2.080084 1.442250 2.000000 1.259921 
4 -1.817121 -1.912931 2.080084 1.442250 -1.442250 

チェックと同じ210

np.random.seed([3,1415]) 
df = pd.DataFrame(np.random.randint(-10, 10, (5, 5))) 

df 

    0 1 2 3 4 
0 6 1 -8 0 5 
1 3 1 3 9 -2 
2 -10 2 -10 -8 -10 
3 -3 9 3 8 2 
4 -6 -7 9 3 -3 

f = lambda x: np.sign(x) * np.power(abs(x), 1./3) 
f(df) 

      0   1   2   3   4 
0 1.817121 1.000000 -2.000000 0.000000 1.709976 
1 1.442250 1.000000 1.442250 2.080084 -1.259921 
2 -2.154435 1.259921 -2.154435 -2.000000 -2.154435 
3 -1.442250 2.080084 1.442250 2.000000 1.259921 
4 -1.817121 -1.912931 2.080084 1.442250 -1.442250 

それはしかしNumPy >= 1.10を必要

df[columns] = np.cbrt(df[columns]) 

np.cbrt:R

%timeit df.applymap(f) 
%timeit f(df) 

1000 loops, best of 3: 1.11 ms per loop 
1000 loops, best of 3: 473 µs per loop 
0

試してください:あなたは、リストまたは列の配列を渡しているよう

sample[columns]=sample[columns]**(1/3) 
+0

残念ながら、このメソッドは負の値では機能しません。 – mamafoku

+0

@amirtZ実際には、エラーを再現するコードを提供できませんか? – Tbaki

+0

あなたは正確にどのコードを参照しているか分かりません。しかし、データフレーム上で元のコードを実行すると、「DataFrameの真理値はあいまいです。a.empty()、a.bool()、a.item()、a.any()またはa.all() " – mamafoku

2

それは単にNumPysキューブのルート機能を使用し、複雑にする必要はありません。古いバージョンでは


あなたの代わりに条件文を使用してのnp.absolutenp.signを使用することができます。

df[columns] = df[columns].apply(lambda x: np.power(np.absolute(x), 1./3) * np.sign(x)) 

これは絶対の立方根を計算し、appropriatly符号を変えます。

+1

私はキューブのルート固有の機能を探していたはずです:-) Nice answer! – piRSquared