2016-10-21 2 views
6

Ich bin hier seltsame Verhalten pandas Verhalten. Ich habe einen Datenrahmen, der wiePandas DataFrame mit Tupel von Strings als Index

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=[('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')]) 

In [14]: df 
Out[14]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN NaN NaN 
(2, b) NaN NaN NaN 

sieht ich den Wert eines beliebigen Elements einstellen

In [15]: df['Col 2'].loc[('1', 'b')] = 6 

In [16]: df 
Out[16]: 
     Col 1 Col 2 Col 3 
(1, a) NaN NaN NaN 
(2, a) NaN NaN NaN 
(1, b) NaN  6 NaN 
(2, b) NaN NaN NaN 

Aber wenn ich gehe, um das Element zu verweisen, die ich mit der gleichen Syntax nur gesetzt, ich

bekommen

Kann mir jemand sagen, was ich falsch mache oder warum dieses Verhalten auftritt? Darf ich den Index nicht einfach als Multielement-Tupel setzen?

bearbeiten

Offenbar arbeitet die Tupelindex in einer Liste gewickelt wird.

Obwohl ich immer noch ein seltsames Verhalten in meinem tatsächlichen Anwendungsfall bekomme, wäre es nett zu wissen, ob dies nicht empfohlen wird.

+1

Die Antwort in [diese Frage] (https://stackoverflow.com/questions/25476880/using-dataframe-ix-with-a-tuple-index-in-pandas) deutet darauf hin, dass es nicht empfohlen Ursache für Mehrdeutigkeit zwischen Tupel-Schlüssel und MultiIndex-Auswahl. –

Antwort

4

Ihr Tupel in den Auswahlklammern wird als eine Sequenz angesehen, die die Elemente enthält, die Sie abrufen möchten. Es ist, als hätten Sie ['1', 'b'] als Argument übergeben. Also die KeyError Nachricht: pandas versucht den Schlüssel '1' zu finden und findet ihn offensichtlich nicht.

Deshalb funktioniert es, wenn Sie zusätzliche Klammern hinzufügen, wie jetzt das Argument eine Sequenz von einem Element wird - Ihr Tupel.

Sie sollten vermeiden, mit Zweideutigkeiten um Listen- und Tupelargumente bei der Auswahl umzugehen. Das Verhalten kann auch unterschiedlich sein, abhängig davon, ob der Index ein einfacher Index oder ein Multiindex ist.

In jedem Fall, wenn Sie hier nach Empfehlungen fragen, ist die eine, die ich sehe, dass Sie versuchen sollten, keine einfachen Indizes aus Tupeln zu erstellen: Pandas funktionieren besser und sind leistungsfähiger zu verwenden, wenn Sie tatsächlich einen Multiindex erstellen statt:

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'], 
        index=pd.MultiIndex.from_tuples([('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')])) 

df['Col 2'].loc[('1', 'b')] = 6 

df['Col 2'].loc[('1', 'b')] 
Out[13]: 6 

df 
Out[14]: 
    Col 1 Col 2 Col 3 
1 a NaN NaN NaN 
2 a NaN NaN NaN 
1 b NaN  6 NaN 
2 b NaN NaN NaN 
Verwandte Themen