若DataFrame首尾非NaN字符串相等,如何将末尾值设为NaN?
解决方案
问题描述
我有如下DataFrame:
value 0 yes 1 nan 2 no 3 nan 4 yes 5 no 6 yes 7 nan 8 nan 9 nan
无法保证首个非NaN值(如示例中的yes)一定位于第一行,它也可能出现在后续索引位置。需要检查首个非NaN字符串与最后一个非NaN字符串是否相等,若相等则将后者设为NaN。本示例中索引6的值与索引0相等,需将其设为NaN,最终结果如下:
value 0 yes 1 nan 2 no 3 nan 4 yes 5 no 6 nan # 因为和首个非NaN值相等,设为nan 7 nan 8 nan 9 nan
实现代码
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'value': ['yes', np.nan, 'no', np.nan, 'yes', 'no', 'yes', np.nan, np.nan, np.nan] }) # 提取所有非NaN的序列,避免原索引干扰 non_nan = df['value'].dropna() # 只有当非NaN值数量≥2时才执行判断逻辑 if len(non_nan) >= 2: first_val = non_nan.iloc[0] last_idx = non_nan.index[-1] last_val = non_nan.iloc[-1] # 若首尾非NaN值相等,将最后一个设为NaN if first_val == last_val: df.loc[last_idx, 'value'] = np.nan print(df)
代码说明
- 先通过
dropna()过滤出所有非NaN值的序列,直接获取首尾有效数据的索引和值,不受原DataFrame中NaN的干扰 - 增加非NaN值数量判断,避免只有单个或没有有效数据时出现索引越界错误
- 通过
loc精准定位最后一个非NaN值的位置,修改为NaN
内容的提问来源于stack exchange,提问作者gotiredofcoding
相关产品推荐
相关产品推荐

