基于文本列字符串条件填充数值列空值的实现及报错处理
报错原因
df['TextColumn'].str.contains(string)返回的是长度和数据表行数一致的布尔值Series,而Python的if判断要求输入单个布尔值,系统无法直接判定一整列的布尔结果整体为真或假,因此抛出真值歧义错误。
实现方案
通过布尔索引筛选出文本列模糊匹配目标字符串的行,仅对这部分行的数值列空值执行填充操作,不会影响其他行的数值:
def fill_nulls(df, string, val): # 构造匹配掩码,na=False表示文本列本身为空的行默认不匹配 match_mask = df['TextColumn'].str.contains(string, na=False) # 仅对匹配行的数值列空值填充 df.loc[match_mask, 'NumericColumn'] = df.loc[match_mask, 'NumericColumn'].fillna(val) return df
使用示例
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({ 'TextColumn': ['苹果手机', '华为平板', '苹果电脑', '小米手机', '苹果耳机'], 'NumericColumn': [5999, np.nan, np.nan, 3999, np.nan] }) # 填充所有文本包含「苹果」的行的数值列空值为6999 df = fill_nulls(df, '苹果', 6999) print(df)
运行后输出结果:
| TextColumn | NumericColumn | |
|---|---|---|
| 0 | 苹果手机 | 5999 |
| 1 | 华为平板 | nan |
| 2 | 苹果电脑 | 6999 |
| 3 | 小米手机 | 3999 |
| 4 | 苹果耳机 | 6999 |
扩展说明
- 若需要区分大小写匹配,可在
str.contains中添加参数case=True,默认不区分大小写 - 若需要关闭正则匹配、仅按普通字符串匹配,可在
str.contains中添加参数regex=False - 函数将数据表作为参数传入、处理后返回,避免了操作全局变量的风险,适配多数据表处理场景
内容的提问来源于stack exchange,提问作者Electronic_Tear
相关产品推荐
相关产品推荐

