超シンプルな列割り当て
パンダのデータフレームは、列の順序付けられた辞書として実装されます。
これは__getitem__
[]
、特定の列を取得するためだけでなく__setitem__
[] =
、新しい列を割り当てるためにも使用できることを意味します。
たとえば、このデータフレームには、[]
アクセサを使用するだけで列を追加できます
size name color
0 big rose red
1 small violet blue
2 small tulip red
3 small harebell blue
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
これは、データフレームのインデックスがオフの場合でも機能することに注意してください。
df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
[] =は進むべき道ですが、気を付けてください!
ただし、があり、pd.Series
それがインデックスがオフになっているデータフレームに割り当てようとすると、問題が発生します。例を参照してください:
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
これはpd.Series
、デフォルトでaに0からnまで列挙されたインデックスがあるためです。そしてパンダの[] =
方法は 「スマート」にしようとします
実際に起こっていること。
あなたは使用する場合[] =
、メソッドパンダを静かに左側のデータフレームと右手シリーズのインデックスのインデックスを使用して外部結合または外側のマージを実行しています。df['column'] = series
サイドノート
この[]=
メソッドは入力に応じてさまざまなことを実行しようとするため、これはすぐに認知的不協和を引き起こし、パンダのしくみを知らないと結果を予測できません。したがって[]=
、コードベースについてはアドバイスしますが、ノートブックでデータを探索する場合は問題ありません。
問題を回避する
があり、pd.Series
それを上から下に割り当てたい場合、または生産的なコードをコーディングしていて、インデックスの順序がわからない場合は、この種の問題を保護する価値があります。
pd.Series
をa np.ndarray
またはにダウンキャストすることができlist
ます。これでうまくいきます。
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
または
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
しかし、これはあまり明確ではありません。
一部のコーダーがやって来て、「ちょっと、これは冗長に見えます、私はこれを最適化します」と言うかもしれません。
明示的な方法
のインデックスをのインデックスに設定pd.Series
することdf
は明示的です。
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
または、より現実的には、おそらくpd.Series
すでに利用可能です。
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
割り当て可能になりました
df['protected'] = protected_series
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
代替方法 df.reset_index()
インデックスの不協和が問題であるため、データフレームのインデックスが物事を指示するべきではないと感じた場合は、単にインデックスを削除できます。これは高速になるはずですが、関数はおそらく 2つのことを行うため、あまりクリーンではありません。
df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
注意事項 df.assign
一方でdf.assign
あなたは何をしているか、メイク、それはより明示的な、それは実際に上記のように、すべて同じ問題を抱えています[]=
df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
df.assign
列が呼び出されないことに注意してくださいself
。エラーが発生します。関数にこれらの種類のアーティファクトがあるため、これはdf.assign
臭いになります。
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
あなたは「まあ、私はその時だけは使わないだろう」と言うかもしれませんself
。しかし、新しい議論をサポートするために、この関数が将来どのように変化するかを知っている人はいます。多分あなたの列名はパンダの新しい更新の引数になり、アップグレードで問題を引き起こします。