我有一个Pandas数据框,其列如下:
id start end
1 101 101
2 102 104
3 108 109
我希望您可以在起始和结束之间填充额外的行,这样输出可能会像这样:
id number
1 101
2 102
2 103
2 104
3 108
3 109
有没有办法在Pandas中实现这个功能?谢谢。
使用嵌套的列表推导式、range
和展平技巧处理元组列表,最后使用DataFrame
构造函数:
zipped = zip(df['id'], df['start'], df['end'])
df = pd.DataFrame([(i, y) for i, s, e in zipped for y in range(s, e+1)],
columns=['id','number'])
print (df)
id number
0 1 101
1 2 102
2 2 103
3 2 104
4 3 108
5 3 109
这里是一个纯粹的pandas解决方案,但就性能而言,@jaezrael的解决方案会更好。
df.set_index('id').apply(lambda x: pd.Series(np.arange(x.start, x.end + 1)), axis = 1)\
.stack().astype(int).reset_index()\
.drop('level_1', 1)\
.rename(columns = {0:'Number'})
id Number
0 1 101
1 2 102
2 2 103
3 2 104
4 3 108
5 3 109