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

基于Python实现DataFrame特定列值合并至前置列的问题求助

解决DataFrame中首行NaN列合并到最近非NaN首行列的问题

问题说明

需求明确:将DataFrame中首行值为NaN的列合并到最近的首行含数值的列末尾;若存在连续多个首行NaN的列,需全部合并至该首行非NaN列。现有代码无法完成连续合并(例如Column E无法合并到已整合Column D的Column C中),以下是解决方案。

示例数据与预期结果

输入DataFrame

Column AColumn BColumn CColumn DColumn E
0159NaNNaN
126101316
237111417
348121518

预期输出

Column AColumn BColumn C
0159
12610
23711
34812
4NaNNaN13
5NaNNaN14
6NaNNaN15
7NaNNaN16
8NaNNaN17
9NaNNaN18

原代码问题分析

原代码的while循环逻辑存在缺陷:

  1. 处理完一个NaN列并删除后,current_column直接自增,会跳过后续连续的NaN列(因为删除列后,后续列的索引已前移)。
  2. 使用shift的方式无法正确将NaN列的所有数据追加到目标列末尾,逻辑不符合需求。

修正后的代码实现

import pandas as pd

# 构造示例数据(可替换为你的实际DataFrame)
data = {
    'Column A': [1, 2, 3, 4],
    'Column B': [5, 6, 7, 8],
    'Column C': [9, 10, 11, 12],
    'Column D': [None, 13, 14, 15],
    'Column E': [None, 16, 17, 18]
}
df = pd.DataFrame(data)

# 标记最近的首行非NaN基准列,合并对应NaN列
current_base_col = None
cols_to_drop = []

for col in df.columns:
    # 判断当前列首行是否为非NaN
    if not pd.isna(df.iloc[0, df.columns.get_loc(col)]):
        current_base_col = col
    else:
        if current_base_col is not None:
            # 将当前NaN列的非空值追加到基准列末尾
            df[current_base_col] = pd.concat([df[current_base_col], df[col].dropna()], ignore_index=True)
            cols_to_drop.append(col)

# 批量删除已合并的NaN列
df.drop(cols_to_drop, axis=1, inplace=True)

# 统一所有列的长度,补全NaN
max_row_count = max(len(df[col]) for col in df.columns)
for col in df.columns:
    df[col] = df[col].reindex(range(max_row_count))

print(df)

代码逻辑说明

  1. 基准列标记:遍历所有列,遇到首行非NaN的列就设为当前基准列。
  2. 合并NaN列:每遇到首行NaN的列,就将该列的非空值直接追加到最近的基准列末尾,同时记录需要删除的列。
  3. 统一列长度:合并完成后,将所有列的长度统一到最长列的长度,用NaN补全空缺行,保证DataFrame结构一致。

内容的提问来源于stack exchange,提问作者n.o.b.667

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:45:23