Hoe voeg ik een lege kolom toe aan een dataframe?

Wat is de gemakkelijkste manier om een ​​lege kolom toe te voegen aan een pandas DataFrame-object? Het beste dat ik ben tegengekomen is zoiets als

df['foo'] = df.apply(lambda _: '', axis=1)

Is er een minder perverse methode?


Antwoord 1, autoriteit 100%

Als ik het goed begrijp, moet de opdracht het volgende bevatten:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Antwoord 2, autoriteit 12%

Toevoegen aan het antwoord van DSM en voortbouwen op deze bijbehorende vraag , zou ik de aanpak in twee gevallen splitsen:

  • Een enkele kolom toevoegen: wijs gewoon lege waarden toe aan de nieuwe kolommen, b.v. df['C'] = np.nan

  • Meerdere kolommen toevoegen: ik raad aan om de .reindex(columns=[...]) methode van panda’s om de nieuwe kolommen toe te voegen aan de kolomindex van het dataframe. Dit werkt ook voor het toevoegen van meerdere nieuwe rijen met .reindex(rows=[...]). Houd er rekening mee dat u in nieuwere versies van Panda’s (v>0.20) een axis-zoekwoord kunt opgeven in plaats van expliciet toe te wijzen aan columns of rows.

Hier is een voorbeeld van het toevoegen van meerdere kolommen:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

of

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Je kunt ook altijd een nieuw (leeg) dataframe samenvoegen met het bestaande dataframe, maar dat voelt niet zo pythonisch voor mij 🙂


Antwoord 3, autoriteit 9%

een nog eenvoudigere oplossing is:

df = df.reindex(columns = header_list)                

waarbij “header_list” een lijst is met de koppen die u wilt weergeven.

elke koptekst in de lijst die nog niet in het dataframe staat, wordt hieronder met lege cellen toegevoegd.

dus als

header_list = ['a','b','c', 'd']

vervolgens worden c en d toegevoegd als kolommen met lege cellen


Antwoord 4, autoriteit 6%

Ik hou van:

df['new'] = pd.Series(dtype='your_required_dtype')

Als je een leeg dataframe hebt, zorgt deze oplossing ervoor dat er geen nieuwe rij met alleen NaN wordt toegevoegd.

Het specificeren van dtype is niet strikt noodzakelijk, maar nieuwere versies van Panda’s produceren een DeprecationWarning indien niet gespecificeerd.


Antwoord 5, autoriteit 5%

Vanaf v0.16.0, DF.assign() kan worden gebruikt om nieuwe kolommen (single/multiple) toe te wijzen aan een DF. Deze kolommen worden in alfabetische volgorde ingevoegd aan het einde van de DF.

Dit is voordelig in vergelijking met eenvoudige toewijzing in gevallen waarin u een reeks gekoppelde bewerkingen rechtstreeks op het geretourneerde dataframe wilt uitvoeren.

Beschouw hetzelfde DF-voorbeeld dat door @DSM is gedemonstreerd:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4
df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Merk op dat dit een kopie retourneert met alle vorige kolommen samen met de nieuw gemaakte kolommen. Om de originele DF dienovereenkomstig te wijzigen, gebruikt u het als volgt: df = df.assign(...) aangezien het inplace bewerking momenteel.


Antwoord 6

als u een kolomnaam uit een lijst wilt toevoegen

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

Antwoord 7

@emunsing’s antwoord is echt cool voor het toevoegen van meerdere kolommen, maar ik kreeg het niet voor me werkend in python 2.7. In plaats daarvan ontdekte ik dat dit werkt:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

Antwoord 8

Men kan df.insert(index_to_insert_at, column_header, init_value) gebruiken om een ​​nieuwe kolom bij een specifieke index in te voegen.

cost_tbl.insert(1, "col_name", "") 

De bovenstaande verklaring zou een lege kolom invoegen na de eerste kolom.


Antwoord 9

De onderstaande code behandelt de vraag “Hoe voeg ik een aantal lege kolommen toe aan mijn bestaande dataframe”. Om oplossingen voor soortgelijke problemen op één plek te houden, voeg ik het hier toe.

Benadering 1 (om 64 extra kolommen te maken met kolomnamen van 1-64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Benadering 2 (om 64 extra kolommen te maken met kolomnamen van 1-64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

Antwoord 10

Je kunt doen

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

Antwoord 11

dit werkt ook voor meerdere kolommen:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
df1 = pd.DataFrame(columns=['C','D','E'])
df = df.join(df1, how="outer")
>>>df
    A   B   C   D   E
0   1   2   NaN NaN NaN
1   2   3   NaN NaN NaN
2   3   4   NaN NaN NaN

Doe dan wat je wilt doen met de kolommen
pd.Series.fillna(),pd.Series.map()
enz.


Antwoord 12

Sorry dat ik mijn antwoord in het begin niet goed heb uitgelegd. Er is nog een andere manier om een ​​nieuwe kolom aan een bestaand dataframe toe te voegen.
1e stap, maak een nieuw leeg dataframe (met alle kolommen in uw dataframe, plus een nieuwe of enkele kolommen die u wilt toevoegen) genaamd df_temp
2e stap, combineer de df_temp en uw dataframe.

df_temp = pd.DataFrame(columns=(df_null.columns.tolist() + ['empty']))
df = pd.concat([df_temp, df])

Het is misschien de beste oplossing, maar het is een andere manier om over deze vraag na te denken.

de reden waarom ik deze methode gebruik is omdat ik de hele tijd deze waarschuwing krijg:

: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df["empty1"], df["empty2"] = [np.nan, ""]

geweldig, ik heb de manier gevonden om de waarschuwing uit te schakelen

pd.options.mode.chained_assignment = None 

Antwoord 13

De reden dat ik naar zo’n oplossing zocht, is simpelweg om spaties toe te voegen tussen meerdere DF’s die kolomsgewijs zijn samengevoegd met behulp van de pd.concat-functie en vervolgens zijn geschreven om uit te blinken met xlsxwriter.

df[' ']=df.apply(lambda _: '', axis=1)
df_2 = pd.concat([df,df1],axis=1)                #worked but only once. 
# Note: df & df1 have the same rows which is my index. 
#
df_2[' ']=df_2.apply(lambda _: '', axis=1)       #didn't work this time !!?     
df_4 = pd.concat([df_2,df_3],axis=1)

Vervolgens heb ik de tweede lambda-oproep vervangen door

df_2['']=''                                 #which appears to add a blank column
df_4 = pd.concat([df_2,df_3],axis=1)

De uitvoer waarop ik het heb getest, was het gebruik van xlsxwriter om uit te blinken.
Lege Jupyter-kolommen zien er hetzelfde uit als in Excel, hoewel ze geen xlsx-opmaak hebben.
Ik weet niet zeker waarom de tweede Lambda-oproep niet werkte.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

seven + 13 =

Other episodes