1 つの割り当てで複数の列を Pandas データフレームに追加する方法 質問する

1 つの割り当てで複数の列を Pandas データフレームに追加する方法 質問する

Pandas を使用して複数の列を同時にパンダに追加する方法を見つけようとしています。これを複数の繰り返し手順ではなく 1 つの手順で実行したいと思います。

import pandas as pd

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

ここではうまくいくと思いました...

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

ベストアンサー1

あなたの構文も機能すると思っていました。問題は、列リスト構文 ( df[[new1, new2]] = ...) を使用して新しい列を作成するときに、pandas では右側が 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) リストの展開を使用して、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) 新しい列を含む一時的なDataFrameを作成し、元のDataFrameと結合します。.concat:

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) 3と同様だが、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つよりも「自然な」方法で新しいDataFrameを作成できますが、新しい列はアルファベット順に並べ替えられます(少なくとも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) これは興味深いです(この答え) ですが、いつそれが面倒なことになるかはわかりません。

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

注: これらのオプションの多くは、すでに他の質問で取り上げられています。

おすすめ記事