Sözdiziminizin de çalışmasını beklerdim. Sorun, sütun listesi sözdizimi ( df[[new1, new2]] = ...
) ile yeni sütunlar oluşturduğunuzda , pandaların sağ tarafın bir DataFrame olmasını gerektirmesi nedeniyle ortaya çıkar ( DataFrame'in sütunlarının sütunlarla aynı adlara sahip olmasının aslında önemli olmadığını unutmayın. yaratıyorsun).
Sözdiziminiz, mevcut sütunlara skaler değerler atamak için iyi çalışır ve pandalar da tek sütunlu sözdizimini ( df[new1] = ...
) kullanarak yeni bir sütuna skaler değerler atamaktan memnuniyet duyar . Dolayısıyla çözüm, bunu birkaç tek sütunlu atamaya dönüştürmek veya sağ taraf için uygun bir DataFrame oluşturmaktır.
İşte birkaç yaklaşımlardır olacaktır çalışır:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Ardından aşağıdakilerden biri:
1) Listeyi açarak üç ödev bir arada:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
2) DataFrame
tek bir satırı dizine uyacak şekilde rahatça genişletir, böylece bunu yapabilirsiniz:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
3) Yeni sütunlarla geçici bir veri çerçevesi oluşturun, ardından orijinal veri çerçevesiyle daha sonra birleştirin:
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) Bir öncekine benzer, ancak join
yerine kullanmak concat
(daha az verimli olabilir):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
5) Yeni veri çerçevesini oluşturmanın önceki ikisinden daha "doğal" bir yoludur, ancak yeni sütunlar alfabetik olarak sıralanacaktır (en azından Python 3.6 veya 3.7'den önce ):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
6) .assign()
Birden çok sütun argümanıyla kullanın .
@ Zero'nun cevabındaki bu değişkeni çok beğeniyorum, ancak öncekinde olduğu gibi, yeni sütunlar her zaman alfabetik olarak sıralanacak, en azından Python'un ilk sürümlerinde:
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) Sonunda, üç ayrı görevi bitirmek zor:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Not: Bu seçeneklerin birçoğu zaten diğer yanıtlar örtülü edilmiştir: DataFrame için birden çok sütun ekleyin ve bunları varolan kolona eşit seti , bir pandalar DataFrame için aynı anda birden sütunlar eklemek mümkün mü? , Pandalar DataFrame'e birden çok boş sütun ekleyin
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"