2016-08-06 16 views
0

Ich habe Daten in folgenden Form angeordnet:[Numpy/Pandas] Wie kann ich einen Panel-Datensatz effizient aus Transaktionsdatensätzen erstellen?

ID,DATE,STATUS 
1,6/20/2011,A 
1,1/14/2013,B 
1,8/1/2016,C 
2,3/1/2005,A 
2,4/30/2005,B 
2,6/30/2010,C 
2,8/20/2010,D 

Ich mag diese Transaktionen in eine unausgeglichene Panel mit einer jährlichen Frequenz konvertieren:

ID,YEAR,STATUS 
1,2011,A 
1,2012,A 
1,2013,B 
1,2014,B 
1,2015,B 
1,2016,C 
2,2005,B 
2,2006,B 
2,2007,B 
2,2008,B 
2,2009,B 
2,2010,D 

Also im Grunde möchte ich eine jährliche Serie für jede ID Das umfasst das erste bis letzte Datum, das für diese ID beobachtet wurde. Der Status in jedem Jahr ist der letzte im Jahr beobachtete Status, wenn mehr als ein Datensatz für dieses Jahr vorhanden ist oder der letzte beobachtete Status, wenn in diesem Jahr kein Datum vorhanden ist.

Dies ist ein großer Datensatz, also muss eine gute Antwort effiziente Methoden von numpy/pandas verwenden.

Antwort

2

Hier ist eine Art und Weise:

import pandas as pd 
df = pd.read_csv('file', parse_dates=['DATE']) 
df = df.set_index('DATE').resample('A').ffill() 
df['YEAR'] = df.index.year 
df = df.sort_values(['ID', 'YEAR']).reset_index(drop=True) 
df 
Out: 
    ID STATUS YEAR 
0 1  A 2011 
1 1  A 2012 
2 1  B 2013 
3 1  B 2014 
4 1  B 2015 
5 1  C 2016 
6 2  B 2005 
7 2  B 2006 
8 2  B 2007 
9 2  B 2008 
10 2  B 2009 
11 2  D 2010 
+0

Brilliant! Vielen Dank. – dlm

+0

Es scheint, dass dies nur funktioniert, wenn die Daten eindeutig sind. – dlm