如何用Python条件逻辑处理含重复值DataFrame列映射及报错排查
问题解答
一、SettingWithCopyError报错原因
这个错误的核心是:你当前操作的market_info_df1不是独立的原始DataFrame,而是从某个父DataFrame通过切片(比如布尔索引、列选择等)得到的副本或视图。Pandas无法判断你是想修改这个副本,还是想修改背后的原始DataFrame,所以抛出这个错误,避免你因误操作导致原始数据未被修改的问题。
解决办法
- 显式复制:在创建
market_info_df1时,调用.copy()方法生成独立DataFrame,示例:market_info_df1 = original_dataframe[your_slice_condition].copy() - 使用
.loc赋值:通过.loc明确指定行和列进行赋值,确保操作目标明确:market_info_df1.loc[:, 'reason'] = s1.combine_first(s2)
二、三个条件逻辑的实现代码
针对你提出的三个映射规则,以下是可直接运行的实现代码:
import pandas as pd def apply_reason_mapping(df): # 条件1:首个issue_status=100且trading_state为None的行,reason设为'F' mask_100_none = (df['issue_status'] == 100) & df['trading_state'].isna() first_match = mask_100_none.idxmax() if mask_100_none[first_match]: df.loc[first_match, 'reason'] = 'F' # 筛选所有issue_status=400且trading_state为None的行索引 mask_400_none = (df['issue_status'] == 400) & df['trading_state'].isna() valid_indices = mask_400_none[mask_400_none].index.tolist() # 条件2:倒数第二个符合条件的行,reason设为'SL' if len(valid_indices) >= 2: df.loc[valid_indices[-2], 'reason'] = 'SL' # 条件3:最后一个符合条件的行,reason设为'L' if len(valid_indices) >= 1: df.loc[valid_indices[-1], 'reason'] = 'L' return df # 测试第一个示例DataFrame df1 = pd.DataFrame({ 'issue_status': [100, 100, 400, 100, 400, 100, 400, 100, 400], 'trading_state': ['A0', None, None, None, None, 'B2', None, None, 'A6'], 'reason': ['', '', '', '', '', '', '', '', ''] }) print("处理后第一个DataFrame:") print(apply_reason_mapping(df1)) # 测试第二个示例DataFrame df2 = pd.DataFrame({ 'issue_status': [400, 100, 400, 400, 100, 100], 'trading_state': [None, 'A0', None, 'A0', None, None], 'reason': ['', '', '', '', '', ''] }) print("\n处理后第二个DataFrame:") print(apply_reason_mapping(df2))
内容的提问来源于stack exchange,提问作者user19667022
相关产品推荐
相关产品推荐

