Python Pandas基于多列条件替换列值并清空指定列的实现问题
pandas DataFrame列值替换问题
初始数据
import pandas as pd import numpy as np data_in = {'A':['A1', '', '', 'A4',''], 'B':['', 'B2', 'B3', '',''], 'C':['C1','C2','','','C5']} df_in = pd.DataFrame(data_in) print(df_in)
初始输出:
A B C 0 A1 C1 1 B2 C2 2 B3 3 A4 4 C5
需求说明
实现逻辑:若C列不为空,且对应行A列或B列不为空,则将A列或B列的值替换为C列的值,替换完成后清空该行C列的内容。
期望输出:
A B C 0 C1 1 C2 2 B3 3 A4 4 C5
现有代码问题
原有代码的条件逻辑分支写反,且没有补充C列清空逻辑,np.where的错误判断规则导致A4、B3被覆盖为空,C列原值也没有被清除。
原有错误代码:
df_in['A'] = np.where( (df_in['A'] !='') & (df_in['C'] != '') , df_in['A'], df_in['C'] ) df_in['B'] = np.where( (df_in['B'] !='') & (df_in['C'] != '') , df_in['B'], df_in['C'] )
错误输出:
A B C 0 C1 C1 1 C2 C2 2 3 4 C5
修正后代码
# 标记C列不为空的行 mask_c_not_empty = df_in['C'] != '' # 替换符合条件的A列值 df_in.loc[mask_c_not_empty & (df_in['A'] != ''), 'A'] = df_in['C'] # 替换符合条件的B列值 df_in.loc[mask_c_not_empty & (df_in['B'] != ''), 'B'] = df_in['C'] # 清空完成替换的行C列值 df_in.loc[mask_c_not_empty & ((df_in['A'] != '') | (df_in['B'] != '')), 'C'] = '' print(df_in)
运行后即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Nono_sad
相关产品推荐
相关产品推荐

