2016-12-09 10 views
0

私は一連の合成データを作成しようとしています。私はPython 3.5.2を使用しています。行のXの平均値の双曲線正接が0.15以上である場合、私は「死んだ」という文字列である新しい列を定義したい。ここから他の列の平均でパンダの条件付き列

#Make Synthetic data (great again?) 
#synth X 
data=pd.DataFrame(np.random.randn(100,5), columns= 'x1','x2','x3','x4','x5']) 
def div10(x): 
    if x<0: 
     return -x/5 
    else: 
     return x/10 
data=data.applymap(div10) 

と:私はそうと、それを定義することによって開始します「そう生きている:私はnp.tanh(data.mean(axis=1))>.15をチェックすると、私はValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index 0')聞いてい

data['Y']=data.apply(lambda x:'dead' if np.tanh(data.mean(axis=1))>.15 else  'alive',axis=1) 

私はboolsのリストを取得します。

私はまた、マップを試してみましたが、AttributeError: 'DataFrame' object has no attribute 'map'

+0

は平均関数からそんなに –

答えて

0

より良い、より速いコードのためにwhereステートメントを使用する方法を学んでください。

np.where(np.tanh(np.mean(np.where(data<0, -data/5, data/10), axis=1)) > .15, 'dead', 'alive') 

これをチャンクに分割します。ここでのステ​​ートメントは、持つデータフレームなどの多次元データで動作することができます。彼らは、条件を取り、コンマの後の最初の引数を返したときに真と第二時に偽

step1 = np.where(data<0, -data/5, data/10) 

numpyのは、あなたが行(軸= 1で適用することができますベクトル化平均機能を有するものapplyを使用する必要はありません)

step2 = np.mean(step1, axis=1) 

ここでは1次元データがあります。生死の状態を取得するための文

np.where(step3 > .15, 'dead', 'alive') 
+0

感謝を軸= 1を削除してくださいどこ双曲線正接を取る

step3 = np.tanh(step2) 

は、最後に別のものを使用します!私が考えることができる仕事をすべて残していたので、「関数がPythonであれば、これは非常に簡単です」と言いました。それはまさにそれです。 – mlanier

0

はあなたが「X」あなたのラムダ関数で指定を使用していることを確認する必要があります。また、xは系列(データフレームの行)であるため、axis = 1は機能しません。 data['Y']=data.apply(lambda x:'dead' if np.tanh(x.mean())>.15 else 'alive',axis=1)

関連する問題