[FIXED] Wie füge ich Pandas Dataframe in einer Zuweisung mehrere Spalten hinzu?

Ausgabe

Ich bin neu bei Pandas und versuche herauszufinden, wie ich Pandas mehrere Spalten gleichzeitig hinzufügen kann. Jede Hilfe ist hier willkommen. Idealerweise würde ich dies in einem Schritt tun und nicht in mehreren wiederholten Schritten …

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...

Lösung

Ich hätte erwartet, dass Ihre Syntax auch funktioniert. Das Problem tritt auf, weil df[[new1, new2]] = ...Pandas beim Erstellen neuer Spalten mit der Spaltenlistensyntax ( ) verlangt, dass die rechte Seite ein DataFrame ist (beachten Sie, dass es eigentlich keine Rolle spielt, ob die Spalten des DataFrame dieselben Namen wie die Spalten haben du erschaffst).

Ihre Syntax funktioniert gut, um vorhandenen Spalten skalare Werte zuzuweisen, und pandas weist auch gerne skalare Werte einer neuen Spalte mit der einspaltigen Syntax ( df[new1] = ...) zu. Die Lösung besteht also darin, dies entweder in mehrere einspaltige Zuweisungen umzuwandeln oder einen geeigneten DataFrame für die rechte Seite zu erstellen.

Hier sind mehrere Ansätze, die funktionieren:

import pandas as pd
import numpy as np

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

Dann eine der folgenden:

1) Drei Aufgaben in einer, mit Listenentpacken:

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

2) DataFrameerweitert bequem eine einzelne Zeile, damit sie mit dem Index übereinstimmt, sodass Sie dies tun können:

df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)

3) Erstellen Sie einen temporären Datenrahmen mit neuen Spalten und kombinieren Sie ihn später mit dem ursprünglichen Datenrahmen:

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) Ähnlich wie im vorherigen, aber mit joinstatt concat(möglicherweise weniger effizient):

df = df.join(pd.DataFrame(
    [[np.nan, 'dogs', 3]], 
    index=df.index, 
    columns=['column_new_1', 'column_new_2', 'column_new_3']
))

5) Die Verwendung eines Diktats ist eine “natürlichere” Methode zum Erstellen des neuen Datenrahmens als die beiden vorherigen, aber die neuen Spalten werden alphabetisch sortiert (zumindest vor Python 3.6 oder 3.7 ):

df = df.join(pd.DataFrame(
    {
        'column_new_1': np.nan,
        'column_new_2': 'dogs',
        'column_new_3': 3
    }, index=df.index
))

6) Verwendung .assign()mit mehreren Spaltenargumenten.

Ich mag diese Variante der Antwort von @zero sehr, aber wie bei der vorherigen werden die neuen Spalten immer alphabetisch sortiert, zumindest bei frühen Versionen von Python:

df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)

7) Das ist interessant (basierend auf https://stackoverflow.com/a/44951376/3830997 ), aber ich weiß nicht, wann es die Mühe wert wäre:

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) Am Ende ist es schwer, drei separate Aufgaben zu schlagen:

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

Hinweis: Viele dieser Optionen wurden bereits in anderen Antworten behandelt: Fügen Sie mehrere Spalten zu DataFrame hinzu und setzen Sie sie einer vorhandenen Spalte gleich . Ist es möglich, einem Pandas-DataFrame mehrere Spalten gleichzeitig hinzuzufügen? , Fügen Sie pandas DataFrame mehrere leere Spalten hinzu


Beantwortet von –
Matthias Fripp


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like