Spodziewałbym się, że twoja składnia też zadziała. Problem pojawia się, ponieważ podczas tworzenia nowych kolumn za pomocą składni listy kolumn ( df[[new1, new2]] = ...
), pandy wymagają, aby prawa strona była ramką DataFrame (zwróć uwagę, że w rzeczywistości nie ma znaczenia, czy kolumny DataFrame mają takie same nazwy jak kolumny tworzysz).
Twoja składnia działa dobrze przy przypisywaniu wartości skalarnych do istniejących kolumn, a pandy z przyjemnością przypisują wartości skalarne do nowej kolumny za pomocą składni jednokolumnowej ( df[new1] = ...
). Więc rozwiązaniem jest albo przekonwertowanie tego na kilka przypisań jednokolumnowych, albo utworzenie odpowiedniej ramki DataFrame dla prawej strony.
Oto kilka podejść, które będą działać:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Następnie jedno z poniższych:
1) Trzy zadania w jednym przy użyciu rozpakowywania list:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) DataFrame
wygodnie rozwija pojedynczy wiersz, aby dopasować go do indeksu, więc możesz to zrobić:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3) Utwórz tymczasową ramkę danych z nowymi kolumnami, a następnie połącz ją z oryginalną ramką danych później:
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) Podobnie jak poprzednio, ale użycie join
zamiast concat
(może być mniej wydajne):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5) Używanie dyktu jest bardziej "naturalnym" sposobem tworzenia nowej ramki danych niż dwie poprzednie, ale nowe kolumny będą sortowane alfabetycznie (przynajmniej przed Pythonem 3.6 lub 3.7 ):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6) Używaj .assign()
z wieloma argumentami kolumnowymi.
Bardzo podoba mi się ten wariant odpowiedzi @ zero, ale podobnie jak poprzedni, nowe kolumny będą zawsze sortowane alfabetycznie, przynajmniej we wczesnych wersjach Pythona:
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) Ostatecznie trudno pokonać trzy oddzielne zadania:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Uwaga: wiele z tych opcji zostały już ujęte w innych odpowiedzi: Dodawanie wielu kolumn do DataFrame i ustawić je wynosić do istniejącej kolumny , Czy jest możliwe aby dodać kilka kolumn na raz do pand DataFrame? , Dodaj wiele pustych kolumn do pandy DataFrame
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"