You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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)

核心逻辑规则

  1. 以Column1的所有值作为基准行锚点,保留原始值,后续新增行补np.nan
  2. 对其他列(Column2/Column3/Column4):
    • 匹配Column1的每个值:若当前列存在该值则保留,否则填np.nan
    • 收集当前列中不属于Column1的新值,追加到列末尾,对应Column1位置填np.nan

原代码问题

原代码仅实现了"保留列中属于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)

代码说明

  1. 锚定基准:以Column1的所有值作为前3行的固定内容,后续行用于存放其他列的新值
  2. 计算总行数:确保能容纳所有基准值和其他列的新值
  3. 分步骤填充其他列:先匹配基准值的对应位置,再追加新值,最后补全NaN到总行数

内容的提问来源于stack exchange,提问作者shubham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:43:11