2016-04-15 8 views
1

Ich habe die folgende gekürzte dataframe:Pandas: Reihen von geraden Anzahl Jahre Einfügen

df1 = pd.DataFrame({'end': [2007, 2013, 2014, 2013, 2014], 'id.thomas'\ 
: ['136', '136', '136', '172', '172'], 'years_exp': ['14', '20', '21', \ 
'14', '15']}, index=[2,3,4,5,6]) 

    end  id.thomas years_exp 
2 2007 136   14 
3 2013 136   20 
4 2014 136   21 
5 2013 172   14 
6 2014 172   15 

wo end Vertreter von Jahren. Ich möchte die end und years_exp Spalte erweitern Konto für die fehlenden Jahre zu berücksichtigen:

end  id.thomas years_exp 
2 2007 136   14 
3 2008 136   15 
4 2009 136   16 
5 2010 136   17 
6 2011 136   18 
7 2012 136   19 
8 2013 136   20 
9 2014 136   21 
10 2013 172   14 
11 2014 172   15 

Ich habe etwa 20 Stunden lang auf dieser gearbeitet und versucht, ‚Ingenieur‘ ein Update. Kennt jemand ein einfaches Python/Pandas Werkzeug/Methode um diese Aufgabe zu erfüllen?

+1

Haben Sie über den Index, um das interessieren? Werden die Spalten "id.thomas" und "years_exp" berechnet oder ist es in Ordnung, dass sie leer sind? –

+0

@Nathan Clement: Danke für Ihre Antwort. Die Indexreihenfolge interessiert mich nicht. Es ist wichtig, dass das 'id.thomas' beibehalten wird. 'years_exp' ist meine Hauptbeschäftigung von der Operation. Es wird später zu einer anderen Datenbank zusammengeführt. 'years_exp'hat bereits von einem anderen [Datenrahmen] berechnet worden (https://github.com/108michael/ms_thesis/blob/master/yearsofserv) –

+1

Also im Grunde, was Sie wollen, ist eine neue Reihe von" Ende "Zeilen, die beginnt mit dem ersten Jahr und endet mit dem letzten Jahr, aber überspringt keine Jahre? –

Antwort

1

Dies dauert die ersten end und years_exp Felder für eine gegebene id.thomas, und zählt diese dann auf das letzte Jahr.

final_year = 2014 
>>> pd.DataFrame([(year, id_, n) 
        for id_, end, years_exp in df1.groupby('id.thomas').first().itertuples() 
        for n, year in enumerate(range(end, final_year + 1), years_exp)], 
       columns=['end', 'id.thomas', 'years_exp']) 
    end id.thomas years_exp 
0 2007  136   14 
1 2008  136   15 
2 2009  136   16 
3 2010  136   17 
4 2011  136   18 
5 2012  136   19 
6 2013  136   20 
7 2014  136   21 
8 2013  172   14 
9 2014  172   15 
+0

Vielen Dank Alexander! Ich werde buchstäblich ohnmächtig werden. Bitte beachten Sie, dass ich dies nach einem kurzen Nickerchen umsetzen werde und bestätige die Ergebnisse durch Anerkennung Ihrer Arbeitslösung. Danke für deine Zeit und Hilfe! –

+1

Das war ein sehr langes Nickerchen ... – Alexander

+0

Schuldig wie geladen. Ich habe Ihren Code angewendet, bekomme aber einen 'Namen' final_year 'ist nicht definiert' Fehler. Außerdem ist dieses Unterfangen etwas komplizierter geworden, als ich ursprünglich dachte. Ich denke, um eine andere Frage zu öffnen. –

1

Wenn years_exp hat noch keine Rolle, können Sie nur den Datenrahmen von groupby bauen:

df2 =pd.concat(
    [pd.DataFrame({'id.thomas':id,'end':range(s.min(),s.max()+1)}) 
        for (id,s) in df1.groupby('id.thomas').end]) 

Für

end id.thomas 
0 2007  136 
1 2008  136 
2 2009  136 
3 2010  136 
4 2011  136 
5 2012  136 
6 2013  136 
7 2014  136 
0 2013  172 
1 2014  172 
Verwandte Themen