熊猫使用循环复制行



我有一个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

一般规则是,我希望根据SNFromSNTo中指定的范围添加新行,因此例如,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

最新更新