2016-07-21 19 views
1

Dies funktioniert:Pandas implizite Typumwandlung von Index Serie

s['Date'] = s.index.get_level_values('Date') 
    s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s['Date']) 

Aber dies nicht:

s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date')) 

Der Fehler ist:

pandas/index.pyx in pandas.index.IndexEngine.get_indexer_non_unique (pandas/index.c:6148)() 

TypeError: 'NoneType' object is not iterable 

s ein Pandas Datenrahmen ist mit ein Multi-Index.

Ich bin vor allem daran interessiert, warum man arbeitet und nicht das andere. Wie ich es sehe, sollten beide funktionieren.

+0

Versuch 's [' Expire Days '] = (pd.to_datetime (s [' Ablauf ']) - s.index.get_level_values ​​(' Date '). To_series()) ' – jezrael

+0

Erzeugt den Fehler:" Index. _join_level für nicht eindeutigen Index ist nicht implementiert. " Das Datum wird nicht eindeutig sein, es ist Teil eines Multi-Index. – cjm2671

+0

Ja, ich bekomme denselben Fehler. Eine mögliche Lösung ist also das Arbeiten mit numpigen Arrays. – jezrael

Antwort

1

Für mich arbeitet values hinzufügen zum Umwandeln Series-numpy array:

s['Expire Days'] = pd.to_datetime(s['Expiration']).values - 
        s.index.get_level_values('Date') 

Probe:

import pandas as pd 

s = pd.DataFrame({'Expiration': {(pd.Timestamp('2015-03-04 00:00:00'), 1): '2015-03-05', 
           (pd.Timestamp('2015-03-03 00:00:00'), 2): '2015-03-05'}}) 
s = s.rename_axis(['Date','a']) 
print (s) 
       Expiration 
Date  a    
2015-03-03 2 2015-03-05 
2015-03-04 1 2015-03-05 


s['Expire Days'] = pd.to_datetime(s['Expiration']).values - 
        s.index.get_level_values('Date') 
print (s) 
       Expiration Expire Days 
Date  a       
2015-03-04 1 2015-03-05  1 days 
2015-03-03 1 2015-03-05  2 days 

EDIT von Kommentar:

s['Date'] = s.index.get_level_values('Date') 
s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s['Date']) 

Arbeit schön, weil ndarray als Ausgang get_level_values wird in Spalte Expire Days in Series umgewandelt.


s['Expire Days'] = (pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date')) 

nicht funktioniert, pd.to_datetime (s [ 'Verfall']) ist Series und s.index.get_level_values('Date')ndarray ist. Sie benötigen also beide numpy Arrays oder beide Serien.

Und weil Fehler:

"Index._join_level on non-unique index is not implemented."

in pd.to_datetime(s['Expiration']) - s.index.get_level_values('Date').to_series(), Verwendung sowohl ndarray konvertieren.

+0

Nun, ich stimme zu, das funktioniert, aber ich verstehe nicht * warum * es funktioniert. Des Weiteren ist die Bestellung garantiert, wenn "numply" "indexless" gegossen wird? – cjm2671

+0

Ich denke, Reihenfolge ist kein Problem, weil Ausgabe Array, nicht Wörterbuch ist. – jezrael

+0

Um ehrlich zu sein, ich verstehe, dass das funktioniert, aber es beantwortet nicht wirklich meine ursprüngliche Frage, die * warum * man arbeitet und nicht die andere. – cjm2671