2016-07-06 6 views
4

Ich habe einen Datenrahmen wie folgt aus:Wie füge ich eine Spalte zu einem multi-indizierten DataFrame hinzu?

upper level1 level2 
lower name  name 
1  Mary  Tom 
2  ...  ... 

Was soll ich tun, wenn ich eine andere Spalte unter level1 hinzufügen? Zum Beispiel

upper level1  level2 
lower name age name 
1  Mary 13 Tom 
2  ... ... ... 

kann ich Zugang zu den Daten mit df['level1'].loc[:,'name'], aber ich weiß nicht, wie eine Spalte hinzufügen/entfernen.

Wenn ich df.level1['age']=1 nur verwenden, gibt Python eine Kopie Warnung und nichts in dem Datenrahmen geändert:

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: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
if __name__ == '__main__': 

Antwort

6

Try this:

df.insert(1, ('level1', 'age'), pd.Series([13])) 
+0

es ist so einfach und elegant! – MaxU

+0

@MaxU Vielen Dank. – piRSquared

+0

Danke, es funktioniert! Könnten Sie bitte erklären, warum mein Code falsch ist? – Arthur

4

Sie Tupel in der Zuordnung verwenden können:

In [11]: df[('level1', 'age')] = 13 # or a Series here, rather than a number 

In [12]: df 
Out[12]: 
    upper level1 level2 level1 
    lower name name age 
0  1 Mary Tom  13 
1  2 ... ...  13 
+0

Danke! Kannst du mir bitte sagen, warum mein Code falsch ist? Ich bin neu in Python. – Arthur

+0

@Arthur bei der Erstellung von df.level1 erstellt es eine Sicht, die der Subdataframe ist, der nur die Level1-Spalten hat. Der Versuch, eine neue Spalte in der Ansicht zu erstellen (mit 'df.level1 ['age'] = 1') funktioniert nicht, da Sie die" Ansicht "nicht bearbeiten können (sie ist schreibgeschützt). –

Verwandte Themen