熊猫使用循环复制行

时间:2018-10-26 16:25:40

标签: python pandas numpy

我有一个看起来像这样的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行。

2 个答案:

答案 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