如何为Pandas DataFrame缺失值位置插入多行空记录
解决DataFrame缺失序列插入多行NaN记录的问题
问题说明
现有DataFrame定义如下:
import pandas as pd import numpy as np df = pd.DataFrame({"A":[0,1,3,5,6], "B":['B0','B1','B3','B5','B6'], "C":['C0','C1','C3','C5','C6']})
需求:在A列连续序列的缺失数值位置插入10行记录,其中A列为该缺失数值,B、C列为NaN。例如A列缺失的2和4,各插入10行对应值的NaN记录。
之前尝试的方法仅能为每个缺失值插入1行,代码如下:
df1 = df.merge(how='right', on='A', right = pd.DataFrame({'A':np.arange(df.iloc[0]['A'], df.iloc[-1]['A']+1)})).reset_index().drop(['index'], axis=1)
可行解决方案
方法一:循环构造扩展A序列
# 生成A列的完整连续序列 full_A = np.arange(df['A'].min(), df['A'].max() + 1) # 构造包含重复行的A列表:原数据存在的A保留1行,缺失的A重复10次 expanded_A = [] for a in full_A: if a in df['A'].values: expanded_A.append(a) else: expanded_A.extend([a] * 10) # 创建基础DataFrame并合并原数据 result = pd.DataFrame({'A': expanded_A}).merge(df, on='A', how='left') # 查看结果 print(result)
方法二:利用repeat方法更简洁实现
# 生成完整A序列,并标记每个值的重复次数 full_A_df = pd.DataFrame({'A': np.arange(df['A'].min(), df['A'].max() + 1)}) full_A_df['repeat_count'] = full_A_df['A'].isin(df['A']).map({True: 1, False: 10}) # 按标记的次数重复行,再合并原数据 result = (full_A_df .loc[full_A_df.index.repeat(full_A_df['repeat_count'])] .drop('repeat_count', axis=1) .merge(df, on='A', how='left')) # 查看结果 print(result)
方法说明
两种方法的核心逻辑一致:
- 先生成A列的完整连续序列,覆盖从最小值到最大值的所有整数;
- 对序列中原数据不存在的A值,生成10行重复记录;原数据存在的A值保留1行;
- 通过左合并原DataFrame,自动为原数据存在的A值填充B、C列,缺失的A值则自动填充NaN,最终得到需求的结果。
内容的提问来源于stack exchange,提问作者dramarama
相关产品推荐
相关产品推荐

