2017-12-29 6 views
1

Ich versuche, das letzte tragfähige Datum in einem Multi-Index-Datenrahmen zu erhalten:Pandas PeriodIndex boolean Scheibe Rückkehr gesamter Index

ix = pd.MultiIndex.from_product([["a"], pd.PeriodIndex(start="2017-01", end="2017-03")]) 
df = pd.DataFrame(data=[0,1, np.nan], index=ix, columns=["test"]) 
df # outputs 
      test 
a 2017-01 0.0 
    2017-02 1.0 
    2017-03 NaN 

So weit so gut, aber das Schneiden und die letzten kehrt den gesamten Index Rückkehr :

df.loc[df["test"].notnull(), "test"].index 
MultiIndex(levels=[['a'], [2017-01, 2017-02, 2017-03]], labels=[[0, 0], [0, 1]]) 

Mein Denken ist, sollte dies ein Array zurück, wo .index.levels[1][-1] letztes Element so etwas wie Period('2017-02') ist?

+1

'df.last_valid_index()'? – ayhan

+0

@ayhan Schön! Etwas gelernt. Wirst du eine Antwort schreiben? –

+1

@ cᴏʟᴅsᴘᴇᴇᴅ Es schien, als ob das Beispiel nur so aussehen könnte, um ein MCVE zu erstellen, und das eigentliche Problem bestand darin, die ungenutzten Indizes zu behalten. Fühlen Sie sich frei, das in Ihrer Antwort zu erwähnen. :) – ayhan

Antwort

3

Tat es sollte, und Sie können es tun, dass, wenn Sie so wollen, remove_unused_levels mit - entfernt

i = df.loc[df["test"].notnull(), "test"] 
i.index = i.index.remove_unused_levels() 
i.index 
MultiIndex(levels=[['a'], [2017-01, 2017-02]], 
      labels=[[0, 0], [0, 1]]) 

Diese Funktion diese Werte, die nicht wirklich in der aktuellen Datenrahmen bestehen Scheibe.


Alternativ können Sie die aktuellen Werte in der index anzeigen, indem Sie das values Attribut Abfrage -

i.index.values 
array([('a', Period('2017-01', 'M')), ('a', Period('2017-02', 'M'))], dtype=object) 

Wenn es nur der letzte gültige Index ist Sie wollen (wie Ihre Frage als solche angedeutet), dann können Sie verwenden @ayhan's suggestion: last_valid_index -

i.last_valid_index() 
('a', Period('2017-02', 'M')) 

Es hat eine Schwester Funktion, first_valid_index -

i.first_valid_index() 
('a', Period('2017-01', 'M')) 

Es gibt nicht viel mehr Gebrauch dieser Funktionen neben diese beiden Werte abfragen.

+0

Scheint seltsam, dies nicht automatisch zu tun. Vielen Dank! – Tony

+0

@Tony In der Tat, aber ich bin mir sicher, dass es einen guten Grund dafür gibt. Nächstes Mal, wenn ich Andy oder Jeff sehe, frage ich sie :-) –

+0

Für dieses Problem ging ich mit @ ayhan's Antwort, nur weil ich die letzte benötigte. Aber Ihre frühere Antwort ging auf meine nächste Frage ein, die diesen Index in einen anderen Datenrahmen übertragen würde. Sie beide rocken. – Tony

Verwandte Themen