2016-04-15 31 views
1

行,我有以下刪節dataframe熊貓:插入的偶數年

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 

其中end代表的年。我想擴大endyears_exp列佔賬戶失蹤多年:

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 

我一直在這約20個小時,試圖「工程師」的修正。有誰知道一個簡單的Python /熊貓工具/方法來完成這項任務嗎?

+1

你關心的索引順序? 'id.thomas'和'years_exp'列是否被計算出來,還是可以讓它們變空? –

+0

@Nathan Clement:謝謝你的迴應。我不關心索引順序。保持'id.thomas'非常重要。 '年代表達式'是我從這次行動中脫身的主要原因。它稍後將被合併到另一個數據庫。 '年表達式'已經從另一個[dataframe](https://github.com/108michael/ms_thesis/blob/master/yearsofserv) –

+1

計算出來了。所以基本上你想要的是有一個新的範圍的「結束」行開始第一年和去年結束,但不跳過任何年份? –

回答

1

這需要給定id.thomas的第一個endyears_exp字段,然後將它們列舉到最後一年。

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

非常感謝亞歷山大!我即將徹底退出。請不要介意我會在短暫的午睡後執行此操作,並通過確認您的工作解決方案來確認結果。感謝您的時間和協助! –

+1

這是一個非常長的午睡... – Alexander

+0

罪名爲收費。我申請了你的代碼,但得到了一個'name'final_year'未定義'錯誤。而且,這種努力已經變得比我原先想象的要複雜一些。我正在考慮打開另一個問題。 –

1

如果years_exp還不打緊,你可以建立從GROUPBY數據框:

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

對於

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