基于Python实现DataFrame特定列值合并至前置列的问题求助
解决DataFrame中首行NaN列合并到最近非NaN首行列的问题
问题说明
需求明确:将DataFrame中首行值为NaN的列合并到最近的首行含数值的列末尾;若存在连续多个首行NaN的列,需全部合并至该首行非NaN列。现有代码无法完成连续合并(例如Column E无法合并到已整合Column D的Column C中),以下是解决方案。
示例数据与预期结果
输入DataFrame
| Column A | Column B | Column C | Column D | Column E | |
|---|---|---|---|---|---|
| 0 | 1 | 5 | 9 | NaN | NaN |
| 1 | 2 | 6 | 10 | 13 | 16 |
| 2 | 3 | 7 | 11 | 14 | 17 |
| 3 | 4 | 8 | 12 | 15 | 18 |
预期输出
| Column A | Column B | Column C | |
|---|---|---|---|
| 0 | 1 | 5 | 9 |
| 1 | 2 | 6 | 10 |
| 2 | 3 | 7 | 11 |
| 3 | 4 | 8 | 12 |
| 4 | NaN | NaN | 13 |
| 5 | NaN | NaN | 14 |
| 6 | NaN | NaN | 15 |
| 7 | NaN | NaN | 16 |
| 8 | NaN | NaN | 17 |
| 9 | NaN | NaN | 18 |
原代码问题分析
原代码的while循环逻辑存在缺陷:
- 处理完一个NaN列并删除后,
current_column直接自增,会跳过后续连续的NaN列(因为删除列后,后续列的索引已前移)。 - 使用
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)
代码逻辑说明
- 基准列标记:遍历所有列,遇到首行非NaN的列就设为当前基准列。
- 合并NaN列:每遇到首行NaN的列,就将该列的非空值直接追加到最近的基准列末尾,同时记录需要删除的列。
- 统一列长度:合并完成后,将所有列的长度统一到最长列的长度,用NaN补全空缺行,保证DataFrame结构一致。
内容的提问来源于stack exchange,提问作者n.o.b.667
相关产品推荐
相关产品推荐

