私はあなたの構文もうまくいくと思っていたでしょう。column-list構文(df[[new1, new2]] = ...
)、パンダでは右側がDataFrameである必要がある DataFrameの列が列と同じ名前であるかどうかは実際には問題ではないことに注意してください)あなたが作成しています)。
構文は既存の列にスカラー値を割り当てるためにうまく機能し、pandasも単一列構文(df[new1] = ...
)を使用して新しい列にスカラー値を割り当てます。したがって、解決策は、これをいくつかの単一列の割り当てに変換するか、右側に適切なDataFrameを作成することです。
ここではいくつかのアプローチですます仕事は:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
次に、次のいずれか:
1)リストのアンパックを使用して、1つの3つの割り当て:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2)DataFrame
インデックスに一致するように単一の行を拡張するので、これを行うことができます:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3)新しい列で一時データフレームを作成し、後で元のデータフレームと結合します。
df = pd.concat(
[
df,
pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
)
], axis=1
)
4)前と同様ですが、join
代わりに使用しますconcat
(効率が低下する可能性があります):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5)辞書を使用することは、前の2つよりも新しいデータフレームを作成するためのより「自然な」方法ですが、新しい列はアルファベット順にソートされます(少なくともPython 3.6または3.7より前)。
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6).assign()
複数の列引数とともに使用します。
私は@zeroの回答でこのバリアントを非常に気に入っていますが、以前のバージョンと同様に、少なくとも初期バージョンのPythonでは、新しい列は常にアルファベット順にソートされます。
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
new_vals = [np.nan, 'dogs', 3]
df = df.reindex(columns=df.columns.tolist() + new_cols) # add empty cols
df[new_cols] = new_vals # multi-column assignment works for existing cols
8)結局、3つの別々の課題に勝つことは困難です。
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
注:これらのオプションの多くは、すでに他の回答でカバーされています:DATAFRAMEに複数の列を追加し、それらを既存の列に等しく設定、それはパンダのデータフレームに一度に複数の列を追加することは可能ですか?、複数の空の列をpandas DataFrameに追加します
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"