2017-09-15 11 views
2

私は、国名が&のデータフレームを取得しました。 国のエネルギー出力がエネルギー出力の中央値を上回るか下回るかに基づいて、1または0を割り当てる新しい列を追加する必要があります。いくつかのダミーコードは次のとおりです。Pandas DataFrame - 他の列に基づいて1,0の値を割り当てます

import pandas as pd 
def answer(): 
    df = pd.DataFrame({'name':['china', 'america', 'canada'], 'output': [33.2, 15.0, 5.0]}) 
    df['newcol'] = df.where(df['output'] > df['output'].median(), 1, 0) 
    return df['newcol'] 
answer() 

コードはValueErrorを返します:2渡されたアイテムの数が間違っては、配置は、私がこのように感じる1

は信じられないほど簡単な修正ですが、私はパンダでの作業に新たなんだ意味します。 私の不満を終わらせてください。

答えて

1

@Vaishaliはなぜpd.DataFrame.whereが期待どおりに機能しなかったかを説明し、代わりにnp.whereを使用することを提案しました。これは非常に良いアドバイスです。

ブール値の結果を整数に変換するだけでよいことをお伝えします。

セットアップ

df = pd.DataFrame({ 
    'name':['china', 'america', 'canada'], 
    'output': [33.2, 15.0, 5.0] 
}) 

オプション1

df['newcol'] = (df['output'] > df['output'].median()).astype(int) 

オプション2
または高速まだ下地numpyのアレイ

01を使用して
o = df['output'].values 
df['newcol'] = (o > np.median(o)).astype(int) 
+0

Hmmm、どうしてこんなことは考えなかったのですか? :) – Vaishali

+0

ありがとう!ブーリアンマスキングを試していましたが、返されたTrue | False値を再フォーマットするのに苦労していました。私はパンダにとって非常に新しく、私はすべてのドキュメントを学ぶ苦労を感じています。あなたと@ヴァイシャリは非常に有益でした:) –

2

ソリューションはベクター化されているのでループは必要ありません。

df['newcol'] = np.where((df['output'] > df['output'].median()), 1, 0) 

    name output newcol 
0 china 33.2 1 
1 america 15.0 0 
2 canada 5.0  0 

誤った数のアイテムが渡されたため、df.whereはnp.whereと少し異なります。自己と同じ形状のオブジェクトを返します。自己の対応するエントリは、condがTrue、そうでなければ他のものからのエントリです。したがって、シリーズの代わりに2つの列を使用してデータフレームを返すので、そのデータフレームをシリーズに割り当てようとすると、エラーメッセージが表示されます。

+0

他の投稿がnp.whereを使用していた理由がわかりました。だから本質的に私がやっていたことは、新しいシリーズにdf全体を渡すことだったので、それは間違いを投げたのですか? –

+0

np.whereは、ブール値以外のデータ型を出力する必要がある場合、if-elseのようなシナリオでは非常に便利です。ブール値の場合でも動作しますが、ブール値のマスキングが優れています。そして、はい、dfを新しいシリーズに渡していたため、エラーが発生しました。 df.where(df ['出力']> df ['出力']を印刷するだけで何が起きているのかを見ることができます) – Vaishali

関連する問題