Voeg meerdere lege kolommen toe aan panda’s DataFrame

Hoe voeg ik meerdere lege kolommen toe aan een DataFramevanuit een lijst?

Ik kan doen:

   df["B"] = None
    df["C"] = None
    df["D"] = None

Maar ik kan niet:

   df[["B", "C", "D"]] = None

KeyError: "['B' 'C' 'D'] not in index"


Antwoord 1, autoriteit 100%

Je zou df.reindexom nieuwe kolommen toe te voegen:

In [18]: df = pd.DataFrame(np.random.randint(10, size=(5,1)), columns=['A'])
In [19]: df
Out[19]: 
   A
0  4
1  7
2  0
3  7
4  6
In [20]: df.reindex(columns=list('ABCD'))
Out[20]: 
   A   B   C   D
0  4 NaN NaN NaN
1  7 NaN NaN NaN
2  0 NaN NaN NaN
3  7 NaN NaN NaN
4  6 NaN NaN NaN

reindexretourneert een nieuw DataFrame, met kolommen die verschijnen in de volgorde waarin ze worden vermeld:

In [31]: df.reindex(columns=list('DCBA'))
Out[31]: 
    D   C   B  A
0 NaN NaN NaN  4
1 NaN NaN NaN  7
2 NaN NaN NaN  0
3 NaN NaN NaN  7
4 NaN NaN NaN  6

De reindexmethode ook als een fill_valueparameter:

In [22]: df.reindex(columns=list('ABCD'), fill_value=0)
Out[22]: 
   A  B  C  D
0  4  0  0  0
1  7  0  0  0
2  0  0  0  0
3  7  0  0  0
4  6  0  0  0

Antwoord 2, autoriteit 88%

Ik zou concatmet behulp van een DataFrame:

In [23]:
df = pd.DataFrame(columns=['A'])
df
Out[23]:
Empty DataFrame
Columns: [A]
Index: []
In [24]:    
pd.concat([df,pd.DataFrame(columns=list('BCD'))])
Out[24]:
Empty DataFrame
Columns: [A, B, C, D]
Index: []

Dus door een lijst door te geven met uw oorspronkelijke df en een nieuwe met de kolommen die u wilt toevoegen, wordt een nieuwe df geretourneerd met de extra kolommen.


Voorbehoud: bekijk de bespreking van de prestaties in de andere antwoordenen/of de commentaardiscussies. reindexkan de voorkeur hebben wanneer prestaties van cruciaal belang zijn.


Antwoord 3, autoriteit 43%

Als u de naam van de oude kolommen niet wilt herschrijven, dan kunt u reindex gebruiken:

df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0)

Volledig voorbeeld:

In [1]: df = pd.DataFrame(np.random.randint(10, size=(3,1)), columns=['A'])
In [1]: df
Out[1]: 
   A
0  4
1  7
2  0
In [2]: df.reindex(columns=[*df.columns.tolist(), 'col1', 'col2'], fill_value=0)
Out[2]: 
   A  col1  col2
0  1     0     0
1  2     0     0

En, als je al een lijsthebt met de kolomnamen, :

In [3]: my_cols_list=['col1','col2']
In [4]: df.reindex(columns=[*df.columns.tolist(), *my_cols_list], fill_value=0)
Out[4]: 
   A  col1  col2
0  1     0     0
1  2     0     0

Other episodes