仅当A、B列为空时合并C列上下行的Pandas数据处理问题
解决DataFrame中仅合并空行A/B对应的C列到上一行的问题
需求回顾
仅当某行的A、B列为空时,将该行C列的值合并到上一行的C列中;若连续两行的A、B列均非空则跳过。
原始数据
A B C 12525 1FWE23 1H654D 14654 24798 14654 S56E82 65116 63546 38945 46456 46485 R68R45 AD545 A5D66 45346 QA6683
预期输出
A B C 12525 1FWE23 1H654D 14654 24798 14654 S56E82 65116 63546 38945 46456 46485 R68R45 AD545 A5D66 45346 QA6683
原代码问题分析
你尝试的代码:
df2.loc[df2['A'] != '', 'C'] = df2["C"] + ' ' + df2["C"].shift(-1).fillna("")
错误核心在于:只要A列非空就会强制拼接下一行的C值,完全没有判断下一行的A、B是否为空。比如原始数据中24798行(A非空)的下一行65116行A、B都非空,代码依然会把这两行的C合并,直接违反了“连续非空行跳过”的规则。
正确解决方案
以下是精准匹配需求的实现代码:
import pandas as pd # 构造原始数据(实际使用时可替换为你的数据源) data = { 'A': ['12525', '', '24798', '65116', '46456', '', 'A5D66'], 'B': ['1FWE23', '', '14654', '63546', '46485', '', '45346'], 'C': ['1H654D', '14654', 'S56E82', '38945', 'R68R45', 'AD545', 'QA6683'] } df = pd.DataFrame(data) # 定位所有A、B同时为空的行 empty_rows = df[(df['A'] == '') & (df['B'] == '')].index # 遍历空行,将C合并到上一行并清空当前行C for idx in empty_rows: if idx > 0: # 避免第一行是空行时出现索引错误 df.loc[idx-1, 'C'] = f"{df.loc[idx-1, 'C']} {df.loc[idx, 'C']}" df.loc[idx, 'C'] = '' # 打印结果 print(df.to_string(index=False))
代码逻辑说明
- 精准锁定目标行:只筛选出A和B都为空的行,这些是唯一需要被合并的对象。
- 定向合并操作:仅将这些空行的C值追加到上一行的C中,同时清空当前行的C,完全不会干扰连续非空的行。
- 边界异常处理:通过
idx > 0的判断,避免第一行是空行时出现索引越界问题(如果你的数据不会出现这种情况,可省略该判断)。
运行后输出的结果完全符合预期要求。
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

