2017-03-24 1 views
1

Ich habe eine CSV (ähnlich der folgenden), die ich versuche, eine Spalte basierend auf zwei Eingaben, von denen eine wird eine genaue Übereinstimmung sein, wird die andere sein ein "am nächsten" so einfach wie weniger als oder gleich.Pandas: to_datetime Tuple Header - dann am nächsten

Datenrahmen Code:

import pandas as pd 
from StringIO import StringIO 

# pseudo CSV data 
x = StringIO(''' 
main,A,A,A,B,B,B 
date,1/1/2016,3/1/2016,5/1/2016,1/1/2016,3/1/2016,5/1/2016 
one,11,22,33,44,55,66 
two,77,88,99,111,222,333 
''') 

df = pd.read_csv(x, header = [0,1], tupleize_cols = True) 

Eingänge etwas sein wie:

my_main = 'B' 
my_date = pd.to_datetime('2/1/2016') 

Und ich würde die Rückkehr gerne sein:

(B, 1/1/2016) 
0    44 
1   111 

Dies auch ein Job sein kann, für einen MultiIndex - aber ich bin völlig mit dieser Funktionalität nicht vertraut.

Ich denke, einer der ersten Schritte wäre, den zweiten Teil des Tuple-Header to_datetime() zu konvertieren, aber ich kann nicht herausfinden, wie man das auch tut.

... offensichtlich df[('B','1/1/2016')] würde funktionieren, aber es ist die am nächsten Teil, der das reiben ist.

Antwort

2

Verwenden Sie ein Listenverständnis, um die richtigen Spalten zu finden.

date = pd.to_datetime('2/1/2016') 
df[[c for c in df if c[0] == 'B' and pd.to_datetime(c[1]) <= date]] 

    (B, 1/1/2016) 
0    44 
1   111 
+0

Ok, du bleibst also bei den Tuple-Headern. Das ist eine fantastische Methode, danke! – pshep123