Pandas如何实现eee列左侧非空值右移紧贴该列(不改动右侧列)
Pandas DataFrame 左侧列非空值右移对齐实现方案
需求核心规则
- 仅处理列
eee左侧的所有列,eee列及其右侧所有列不得做任何修改 - 每行
eee左侧的非空值需整体右移,最终最右侧非空值紧贴eee列,所有非空值连续无间隙,左侧空位填空字符串 - 每行右移位的列数 =
eee左侧总列数 - 该行左侧非空值的总个数
实现思路
- 按
eee列的位置将原始DataFrame拆分为两部分:eee左侧列、eee及右侧列,后者直接复制保留不做处理 - 逐行遍历左侧列数据,过滤掉每行的空字符串,提取连续的非空值序列
- 根据非空值序列长度计算需要前置填充的空字符串数量,拼接为处理后的新行
- 将处理完成的左侧列、保留的
eee及右侧列按原列顺序拼接,得到最终结果
可直接运行的实现代码
import pandas as pd def moveOver(): # 初始化原始测试数据 df = pd.DataFrame({ 'aaa': ['a', 'a', 'a', 'a', 'a', 'a'], 'bbb': ['', 'b', 'b', 'b', '', 'b'], 'ccc': ['', '', 'c', 'c', '', 'c'], 'ddd': ['', '', '', 'd', '', ''], 'eee': ['b', 'c', 'd', 'e', 'b', 'd'], 'fff': ['c', 'd', 'e', 'f', 'c', 'e'], 'ggg': ['d', 'e', 'f', 'g', 'd', 'f'] }) # 定位eee列索引,拆分数据 eee_col_index = df.columns.get_loc('eee') left_cols = df.columns[:eee_col_index].tolist() keep_part = df.iloc[:, eee_col_index:].copy() left_data = df[left_cols].values left_col_total = len(left_cols) processed_left_rows = [] for row in left_data: # 提取当前行所有非空值 valid_vals = [v for v in row if v != ''] # 前置补空后拼接有效值 new_row = [''] * (left_col_total - len(valid_vals)) + valid_vals processed_left_rows.append(new_row) # 拼接为最终DataFrame processed_left_df = pd.DataFrame(processed_left_rows, columns=left_cols, index=df.index) final_df = pd.concat([processed_left_df, keep_part], axis=1) return final_df # 测试验证 if __name__ == "__main__": result = moveOver() # 输出结果和预期finalOutput结构完全一致 print(result.to_dict(orient='list'))
结果验证
运行上述代码后,输出的字典结构与需求中给出的finalOutput完全匹配:
- 索引0、索引4行:仅存的非空值
a右移3位落到ddd列 - 索引1行:非空序列
['a','b']右移2位,分别落到ccc、ddd列 - 其余行均符合右移对齐规则,
eee及右侧列值完全和原始数据一致
如果实际数据中空值为
NaN而非空字符串,只需要修改非空值过滤的判断条件即可适配。
内容的提问来源于stack exchange,提问作者achi00
相关产品推荐
相关产品推荐

