1. ホーム
  2. パイソン

[解決済み] 1つの課題でpandas dataframeに複数の列を追加するにはどうすればよいですか?

2022-04-10 22:04:10

質問

私はpandasの初心者で、pandasに複数の列を同時に追加する方法を見つけようとしています。 どのようなヘルプでも結構です。 理想的には、複数のステップを繰り返すのではなく、1つのステップでこれを行いたいのですが...。

import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)

df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3]  #thought this would work here...

解決方法は?

あなたの構文もうまくいくと思っていたのですが。問題は、カラムリスト構文で新しいカラムを作成したときに ( df[[new1, new2]] = ... ) 、pandasは右辺がDataFrameであることを要求します(DataFrameのカラムが作成するカラムと同じ名前であるかどうかは、実際には問題ではないことに注意してください)。

この構文は、スカラー値を 既存 カラムにスカラー値を割り当てることもできますし、単一カラムの構文 ( 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)リストアンパッキングを使用して、3つの課題を1つにまとめる。

df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]

2) DataFrame は、インデックスに合わせて1行を展開するため、便利です。

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) dictを使用すると、前の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)

7)これは面白い(ベースは https://stackoverflow.com/a/44951376/3830997 ) が、手間をかける価値があるのはいつなのか分からない。

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に複数のカラムを一度に追加することは可能ですか? , pandas DataFrameに複数の空の列を追加する