Wie füge ich DataFrameeiner Liste mehrere leere Spalten hinzu ?
Ich kann:
df["B"] = None
df["C"] = None
df["D"] = None
Aber ich kann nicht tun:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
Wie füge ich DataFrameeiner Liste mehrere leere Spalten hinzu ?
Ich kann:
df["B"] = None
df["C"] = None
df["D"] = None
Aber ich kann nicht tun:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
df[['B','C','D']] = None, None, Noneoder [None, None, None]oderpd.DataFrame([None, None, None])
Antworten:
Ich würde concateinen DataFrame verwenden:
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: []
Wenn Sie also eine Liste mit Ihrem ursprünglichen df und eine neue Liste mit den Spalten übergeben, die Sie hinzufügen möchten, wird ein neuer df mit den zusätzlichen Spalten zurückgegeben.
Vorsichtsmaßnahme: Siehe die Diskussion der Leistung in den anderen Antworten und / oder den Kommentardiskussionen. reindexkann vorzuziehen sein, wenn die Leistung kritisch ist.
pd.concat([df,pd.DataFrame(columns=list('BCD'))])- es macht nichts afaik. Könnte es daran liegen, dass ich benutze df = pd.read_csvund nicht df = pd.DataFrame?
df=pd.concat([df,pd.DataFrame(columns=list('BCD'))])
df.ix[:, col_list]oder indem Sie sie einfach auswählen und wieder dem ursprünglichen df df = df[col_list]
TypeError: data type not understood.
0.19.1Sie müssen den vollständigen Code posten, den ich ausführen kann
Sie können verwenden df.reindex, um neue Spalten hinzuzufügen:
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
reindex gibt einen neuen DataFrame zurück, wobei die Spalten in der angegebenen Reihenfolge angezeigt werden:
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
Die reindexMethode auch als 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
inplace=True. Es macht nicht das, was die meisten Leute denken. Unter der Haube wird immer ein völlig neuer DataFrame erstellt, und dann werden die Daten aus dem neuen DataFrame in den ursprünglichen DataFrame kopiert. Das spart keinen Speicher. So inplace=Trueist Schaufensterdekoration ohne Substanz und wird darüber hinaus irreführend benannt. Ich habe den Code nicht überprüft, aber ich gehe davon aus, df = df.reindex(...)dass mindestens das Zweifache des erforderlichen Speichers erforderlich ist df, und natürlich mehr, wenn reindexdie Anzahl der Zeilen erweitert wird.
Wenn Sie den Namen der alten Spalten nicht neu schreiben möchten, können Sie reindex verwenden:
df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0)
Vollständiges Beispiel :
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
Und wenn Sie bereits eine Liste mit den Spaltennamen haben ,:
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
*in der reindexEingabe macht?
Zusammenfassung alternativer Lösungen:
columns_add = ['a', 'b', 'c']
for-Schleife:
for newcol in columns_add:
df[newcol]= None
Diktiermethode:
df.assign(**dict([(_,None) for _ in columns_add]))
Tupelzuordnung:
df['a'], df['b'], df['c'] = None, None, None
Nur um der Liste der lustigen Möglichkeiten hinzuzufügen:
columns_add = ['a', 'b', 'c']
df = df.assign(**dict(zip(columns_add, [0] * len(columns_add)))
Ich würde verwenden
df["B"], df["C"], df["D"] = None, None, None
oder
df["B"], df["C"], df["D"] = ["None" for a in range(3)]
Noneist anders als 0, aber einige Antworten gehen davon aus, dass es äquivalent ist.NoneWenn Sie zuweisen , erhalten Sie einen Objekttyp d. Wenn Sie jedoch 0 zuweisen, erhalten Sie einen Objekttyp int.