从熊猫数据框中两列的差异创建新行

时间:2021-02-22 10:33:08

标签: python pandas data-manipulation

我有一个数据框。


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)

 

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果有0,首先将end-year中的start-year替换为0,在DataFrame.apply中创建range列,最后{{3} } 删除原来的 startend 年列:

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