如何使用Pandas高效按列中数量值展开DataFrame?
高效实现按Qty复制行并添加序号列的Pandas方案
嗨,我来帮你搞定这个问题!用Python循环处理确实在数据量上去之后效率拉胯,完全可以用Pandas的内置方法来解决,代码简洁还快,根本不需要写循环~
初始数据
先回顾下你的初始DataFrame:
import pandas as pd df = pd.DataFrame({'first-name':['Jan','Leilani'],'Qty':[2,4]})
输出:
| Qty | first-name |
|---|---|
| 2 | Jan |
| 4 | Leilani |
实现步骤
这里我们用repeat复制行,再结合groupby+cumcount()生成序号列,两步就能完成需求:
- 按Qty值复制行:利用
df.index.repeat()方法,根据每行的Qty数值重复对应次数的行:
df_expanded = df.loc[df.index.repeat(df['Qty'])]
这一步后的数据会变成:
| Qty | first-name |
|---|---|
| 2 | Jan |
| 2 | Jan |
| 4 | Leilani |
| 4 | Leilani |
| 4 | Leilani |
| 4 | Leilani |
- 添加position序号列:通过
groupby(level=0)按原索引分组,再用cumcount()生成组内连续计数(默认从0开始),加1后就得到从1起始的序号:
df_expanded['position'] = df_expanded.groupby(level=0).cumcount() + 1
最后可以重置索引让数据更整洁:
df_expanded = df_expanded.reset_index(drop=True)
最终输出
此时的df_expanded就是你想要的结果:
| Qty | first-name | position |
|---|---|---|
| 2 | Jan | 1 |
| 2 | Jan | 2 |
| 4 | Leilani | 1 |
| 4 | Leilani | 2 |
| 4 | Leilani | 3 |
| 4 | Leilani | 4 |
补充说明
你提到的melt函数其实是用来处理宽表转长表的场景(比如把多列合并成一列),并不适配这个需求。而上面用到的方法都是Pandas的向量化操作,比Python循环效率高几个数量级,尤其是数据量大的时候,优势会特别明显~
内容的提问来源于stack exchange,提问作者Maile Cupo
相关产品推荐
相关产品推荐

