我有一个看起来像这样的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行。
答案 0 :(得分:1)
这是使用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
答案 1 :(得分:1)
这是使用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