我有一个DataFrame,它看起来像这样:
SNFrom SNTo Name Age
0 1 4 John 8
1 5 7 Jack 6
使用pandas
,我想产生这样的结果:
Name Age SN
0 John 8 1
1 John 8 2
2 John 8 3
3 John 8 4
4 Jack 6 5
5 Jack 6 6
6 Jack 6 7
一般规则是,我希望根据SNFrom
和SNTo
中指定的范围添加新行,因此例如,John
应该有1-4行,Jack
应该有5-7行。
以下是使用apply
:的一种相对幼稚的方法
设置:
df = pd.DataFrame({'SNFrom':[1,5],'SNTo':[4,7],'Name':['John','Jack'],'Age':[8,6]})
>>> df
Age Name SNFrom SNTo
0 8 John 1 4
1 6 Jack 5 7
解决方案:
new_df = (df.set_index(['Name','Age'])[['SNFrom','SNTo']]
.apply(lambda x: pd.Series(list(range(x.SNFrom, x.SNTo+1))),1)
.stack()
.reset_index(level=[0,1])
.rename(columns={0:'SN'}))
>>> new_df
Name Age SN
0 John 8 1.0
1 John 8 2.0
2 John 8 3.0
3 John 8 4.0
0 Jack 6 5.0
1 Jack 6 6.0
2 Jack 6 7.0
以下是使用np.repeat
:的矢量化解决方案
s = df.SNTo - df.SNFrom
i = np.repeat(df.index, s+1)
t = df.loc[i, ['Name', 'Age', 'SNFrom']]
t.assign(SN=t.groupby(level=0).cumcount() + t.SNFrom).drop('SNFrom', 1)
Name Age SN
0 John 8 1
0 John 8 2
0 John 8 3
0 John 8 4
1 Jack 6 5
1 Jack 6 6
1 Jack 6 7