我有一个数据框。
ID value-a value-b start-year end-year
1 10 15 2010 2012
2 20 24 2011 2013
3 10 20 2012 0
我想生成一个新列“年”,这样:每一行都将在从开始年到结束年的全年重复。
ID value-a value-b year
1 10 15 2010
1 10 15 2011
1 10 15 2012
2 20 25 2011
2 20 24 2012
2 20 24 2013
3 10 20 2012
我使用了以下代码,但无法获得正确的输出:
df =pd.concat([pd.DataFrame({'year': pd.date_range(row.start-year, row.end_year, freq='A'),
'value-a': row.value-a,
'value-b': row.value-b,columns=['year','value-a', 'value-b'])
for i, row in df.iterrows()], ignore_index=True)
任何帮助将不胜感激。
答案 0 :(得分:0)
如果有0
,首先将end-year
中的start-year
替换为0
,在DataFrame.apply
中创建range
列,最后{{3} } 删除原来的 start
和 end
年列:
df['end-year'] = df['end-year'].mask(df['end-year'].eq(0), df['start-year'])
df['year'] = df.apply(lambda x: range(x['start-year'], x['end-year'] + 1), axis=1)
df = df.explode('year').drop(['start-year','end-year'], axis=1).reset_index(drop=True)
print (df)
ID value-a value-b year
0 1 10 15 2010
1 1 10 15 2011
2 1 10 15 2012
3 2 20 24 2011
4 2 20 24 2012
5 2 20 24 2013
6 3 10 20 2012