按单元格值复制行并追加至Pandas DataFrame的实现需求
解决方案:根据指定列的值复制并追加行
嘿,这个需求其实可以用Pandas的几个核心函数轻松实现,我给你准备了两种符合要求的方案,分别对应完全复制行和带复制标记区分原行/复制行的呈现形式,一起来看看吧!
首先先还原你的原始DataFrame:
import pandas as pd df = pd.DataFrame( {'X':('a','b','c','d'), 'Y':('a','b','d','e'), 'Z':('a','b','c','d'), '#':(1,2,1,3) } )
方案一:完全复制行的形式
这个方案会直接将需要复制的行按要求重复,最终结果里原行和复制行完全一致,没有额外标记:
import numpy as np # 计算每一行需要保留/复制的总次数:原行1次 + (#值-1)次复制,所以总次数就是#列的值 repeat_counts = df['#'].values # 根据次数重复行索引 repeated_indices = np.repeat(df.index, repeat_counts) # 基于重复后的索引构造新的DataFrame result_full_copy = df.loc[repeated_indices].reset_index(drop=True)
执行后result_full_copy的结果:
| X | Y | Z | # |
|---|---|---|---|
| a | a | a | 1 |
| b | b | b | 2 |
| b | b | b | 2 |
| c | c | c | 1 |
| d | e | d | 3 |
| d | e | d | 3 |
| d | e | d | 3 |
可以看到第二行(#=2)被复制了1次,第四行(#=3)被复制了2次,完全符合需求。
方案二:带复制标记的形式
如果需要区分原行和复制出来的行,可以添加一个标记列,原行标记为False,复制行标记为True:
# 给每行生成一个标记列表:原行是False,复制的行是True,数量对应#值的次数 df['is_copy'] = df['#'].apply(lambda x: [False] + [True]*(x-1)) # 展开列表,同时将对应的行复制 result_with_flag = df.explode('is_copy').reset_index(drop=True)
执行后result_with_flag的结果:
| X | Y | Z | # | is_copy |
|---|---|---|---|---|
| a | a | a | 1 | False |
| b | b | b | 2 | False |
| b | b | b | 2 | True |
| c | c | c | 1 | False |
| d | e | d | 3 | False |
| d | e | d | 3 | True |
| d | e | d | 3 | True |
这个方案在保留需求功能的同时,能清晰区分哪些是原始行,哪些是复制生成的行,方便后续的数据分析操作。
内容的提问来源于stack exchange,提问作者Zanshin
相关产品推荐
相关产品推荐

