在R中如何根据Trip列的值扩展对应数量的数据行?
如何根据DataFrame中Trip列的数值扩展行(保留所有列)
需求:将DataFrame的每行根据Trip列的数值拆分成对应数量的行,拆分后的Trip值依次为1到原Trip值,且保留数据框中所有其他列(原数据包含15+列)。
示例数据
原数据框df1:
| Id | Trip |
|---|---|
| 1 | 3 |
| 2 | 2 |
| 3 | 2 |
| 4 | 4 |
预期结果
扩展后的df1:
| Id | Trip |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
| 3 | 2 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
| 4 | 4 |
解决方案
方法一:使用assign + explode(简洁直观)
通过构造Trip值的列表,再拆分列表为多行,自动保留所有其他列:
import pandas as pd # 假设df1是你的原始数据框 df_expanded = df1.assign(Trip=df1['Trip'].apply(lambda x: list(range(1, x+1)))).explode('Trip', ignore_index=True)
assign:将原Trip列替换为从1到原数值的整数列表explode:把列表格式的Trip列拆分成多行,其他列自动重复对应次数ignore_index=True:重置结果的索引,避免重复索引
方法二:使用repeat + 分组计数(大数据量更高效)
通过重复行再生成新的Trip值,适合处理大规模数据:
import pandas as pd # 按Trip值重复每行 df_expanded = df1.loc[df1.index.repeat(df1['Trip'])].copy() # 按原索引分组,生成从1开始的连续Trip值 df_expanded['Trip'] = df_expanded.groupby(level=0).cumcount() + 1 # 重置索引 df_expanded = df_expanded.reset_index(drop=True)
index.repeat:根据Trip值重复每行索引,实现行扩展groupby(level=0).cumcount():按原行的索引分组,计数后加1得到1到原Trip值的序列- 该方法避免了构造列表,在数据量较大时性能更优
内容的提问来源于stack exchange,提问作者user18729535
相关产品推荐
相关产品推荐

