如何调整Pandas代码实现DataFrame多列值匹配对齐并补全NaN
问题解决:DataFrame按规则重构列值
输入DataFrame列值
- Column1取值:
('Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml', 'Curl Care Color Protect 200ml') - Column2取值:
('Curl Care Rose 200ml', 'Silidone Damage Control 200ml', 'Curl Care Clean 200ml') - Column3取值:
('Curl Care Rose 200ml', 'Curl Care Color Protect 200ml', 'Curl Care Anti-Hairfall 200ml') - Column4取值:
('Curl Care Color Protect 200ml', 'Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml')
期望输出列值
- Column1取值:
('Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml', 'Curl Care Color Protect 200ml', np.nan, np.nan) - Column2取值:
(np.nan, 'Curl Care Clean 200ml', np.nan, 'Curl Care Rose 200ml', 'Silidone Damage Control 200ml') - Column3取值:
('Curl Care Anti-Hairfall 200ml', np.nan, 'Curl Care Color Protect 200ml', 'Curl Care Rose 200ml', np.nan) - Column4取值:
('Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml', 'Curl Care Color Protect 200ml', np.nan, np.nan)
核心逻辑规则
- 以Column1的所有值作为基准行锚点,保留原始值,后续新增行补
np.nan - 对其他列(Column2/Column3/Column4):
- 匹配Column1的每个值:若当前列存在该值则保留,否则填
np.nan - 收集当前列中不属于Column1的新值,追加到列末尾,对应Column1位置填
np.nan
- 匹配Column1的每个值:若当前列存在该值则保留,否则填
原代码问题
原代码仅实现了"保留列中属于Column1的值,否则设为NaN",但未处理新增行容纳其他列新值的需求,且未按Column1的基准值匹配对应位置,导致行数量与原DataFrame一致,无法得到期望的5行结果。
修改后的代码
import pandas as pd import numpy as np # 构造原始输入DataFrame data = { 'Column1': ['Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml', 'Curl Care Color Protect 200ml'], 'Column2': ['Curl Care Rose 200ml', 'Silidone Damage Control 200ml', 'Curl Care Clean 200ml'], 'Column3': ['Curl Care Rose 200ml', 'Curl Care Color Protect 200ml', 'Curl Care Anti-Hairfall 200ml'], 'Column4': ['Curl Care Color Protect 200ml', 'Curl Care Anti-Hairfall 200ml', 'Curl Care Clean 200ml'] } df = pd.DataFrame(data) # 获取Column1基准值列表 column1_values = df['Column1'].tolist() # 收集所有其他列中不属于Column1的唯一值 extra_values = [] for col in df.columns[1:]: extra_values.extend([val for val in df[col] if val not in column1_values]) unique_extra = list(set(extra_values)) # 计算最终总行数:基准行数 + 新值行数 total_rows = len(column1_values) + len(unique_extra) # 初始化输出DataFrame output_df = pd.DataFrame(index=range(total_rows), columns=df.columns) # 填充Column1:基准值保留,后续行补NaN output_df['Column1'] = column1_values + [np.nan]*(total_rows - len(column1_values)) # 处理其他列 for col in df.columns[1:]: # 第一步:匹配Column1基准值,填充对应位置 matched_vals = [] for val in column1_values: matched_vals.append(val if val in df[col].values else np.nan) # 第二步:收集当前列的非Column1值 extra_vals = [val for val in df[col] if val not in column1_values] # 填充当前列,补NaN到总行数 output_df[col] = matched_vals + extra_vals + [np.nan]*(total_rows - len(matched_vals) - len(extra_vals)) print(output_df)
代码说明
- 锚定基准:以Column1的所有值作为前3行的固定内容,后续行用于存放其他列的新值
- 计算总行数:确保能容纳所有基准值和其他列的新值
- 分步骤填充其他列:先匹配基准值的对应位置,再追加新值,最后补全NaN到总行数
内容的提问来源于stack exchange,提问作者shubham
相关产品推荐
相关产品推荐

