Python如何按flag条件处理Excel数据集且不修改未处理行数据
问题原因分析
- 最初的
ValueError报错:你直接用if flag == 'Not feasible'对整列做布尔判断,pandas无法直接判定一整个序列的真假值,所以抛出歧义错误。 - 拆分后df1日期格式被意外修改:大概率是你读取原始数据时,pandas默认开启了自动日期解析,将整列
Joining_Date都识别为datetime类型,拆分后df1的该列仍为datetime类型,在合并、输出时被自动格式化为统一的日期字符串,和原始格式不一致。
正确实现方案
推荐使用布尔掩码针对性修改符合条件的行,不需要拆分再合并,避免不同子集的列类型不一致导致的格式污染,步骤如下:
- 读取数据时强制指定
Joining_Date为字符串类型,避免原始合格数据的格式被自动转换:
import pandas as pd # 读入数据时指定日期列为字符串,保留原始格式,以下为csv示例,excel同理 df = pd.read_csv('your_data.csv', dtype={'Joining_Date': str}, sep='\s+')
- 定义待处理行的布尔掩码
# 标记所有需要处理的行 mask = df['flag'] == 'Not feasible'
- 仅对掩码标记的行执行清洗操作,其余行保持不变
# 处理日期格式 df.loc[mask, 'Joining_Date'] = pd.to_datetime(df.loc[mask, 'Joining_Date'], errors='coerce').dt.strftime('%Y-%m-%d') # 清洗age列 df.loc[mask, 'age'] = df.loc[mask, 'age'].replace('[^\d.]', '', regex=True).astype(float) # 清洗col4、col5列 df.loc[mask, ['col4','col5']] = df.loc[mask, ['col4','col5']].apply(lambda x: x.astype(str).str.replace('\W','', regex=True)) # 清洗Contact列 df.loc[mask, 'Contact'] = df.loc[mask, 'Contact'].replace('[^\d.]', '', regex=True).astype(float) # 修改flag标记 df.loc[mask, 'flag'] = 'feasible'
- 输出到Excel即可
df.to_excel('processed_data.xlsx', index=False)
内容的提问来源于stack exchange,提问作者NKJ
相关产品推荐
相关产品推荐

