DataFrame が与えられた場合:
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
定数値 (例: 0) を含む新しい列を追加する最も簡単な方法は何ですか?
A B C new
1 1.764052 0.400157 0.978738 0
2 2.240893 1.867558 -0.977278 0
3 0.950088 -0.151357 -0.103219 0
これが私の解決策ですが、なぜ NaN が「新しい」列に入れられるのかわかりません。
df['new'] = pd.Series([0 for x in range(len(df.index))])
A B C new
1 1.764052 0.400157 0.978738 0.0
2 2.240893 1.867558 -0.977278 0.0
3 0.950088 -0.151357 -0.103219 NaN
ベストアンサー1
非常にシンプルなインプレース代入:df['new'] = 0
インプレース変更の場合は、直接割り当てを実行します。この割り当ては、各行に対して pandas によってブロードキャストされます。
df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df
A B C
0 x x x
1 x x x
2 x x x
3 x x x
df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
オブジェクト列に関する注意
空のリストの列を追加したい場合は、次のアドバイスを参考にしてください。
- これを行わないことを検討してください。
object
列はパフォーマンスの面で悪影響を及ぼします。データの構造を再考してください。 - データをスパース データ構造に保存することを検討してください。詳細情報:スパースデータ構造
リストの列を保存する必要がある場合は、同じ参照を複数回コピーしないようにしてください。
# Wrong df['new'] = [[]] * len(df) # Right df['new'] = [[] for _ in range(len(df))]
コピーの生成:df.assign(new=0)
代わりにコピーが必要な場合は、DataFrame.assign
:
df.assign(new='y')
A B C new
0 x x x y
1 x x x y
2 x x x y
3 x x x y
そして、複数の列に同じ値を割り当てる必要がある場合は、次のように簡単です。
c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))
A B C new1 new2
0 x x x y y
1 x x x y y
2 x x x y y
3 x x x y y
複数列の割り当て
最後に、複数の列に異なる値を割り当てる必要がある場合は、assign
辞書を使用できます。
c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)
A B C new1 new2 new3
0 x x x w y z
1 x x x w y z
2 x x x w y z
3 x x x w y z