【发布时间】:2018-08-09 15:41:46
【问题描述】:
我们如何使用开始和结束日期提取DataFrame 并实现此输出?
输入
id start end
1 2009 2014
2 2010 2012
输出
id data
1 2009
1 2010
1 2011
1 2012
1 2013
1 2014
2 2010
2 2011
2 2012
【问题讨论】:
我们如何使用开始和结束日期提取DataFrame 并实现此输出?
输入
id start end
1 2009 2014
2 2010 2012
输出
id data
1 2009
1 2010
1 2011
1 2012
1 2013
1 2014
2 2010
2 2011
2 2012
【问题讨论】:
创建按['id'] 分组的年份之间的日期枚举。索引的额外重新格式化是可选的
import numpy as np
import pandas as pd
melted = df.groupby('id').apply(lambda x:pd.Series(np.arange(x['start'],x['end']+1)))
melted.index = melted.index.droplevel(1)
id
1 2009
1 2010
1 2011
1 2012
1 2013
1 2014
2 2010
2 2011
2 2012
【讨论】:
用途:
df1 = (pd.concat([pd.Series(r.id,np.arange(r.start, r.end + 1)) for r in df.itertuples()])
.reset_index())
df1.columns = ['data','id']
df1 = df1[['id','data']]
print (df1)
id data
0 1 2009
1 1 2010
2 1 2011
3 1 2012
4 1 2013
5 1 2014
6 2 2010
7 2 2011
8 2 2012
【讨论】:
有点难理解,我觉得这个应该比apply快一点
通过使用reindex 和repeat
df.reindex(df.index.repeat(df['end']-df['start']+1)).assign(year=lambda x : x['start']+x.groupby('id').cumcount())
Out[453]:
id start end year
0 1 2009 2014 2009
0 1 2009 2014 2010
0 1 2009 2014 2011
0 1 2009 2014 2012
0 1 2009 2014 2013
0 1 2009 2014 2014
1 2 2010 2012 2010
1 2 2010 2012 2011
1 2 2010 2012 2012
【讨论】: