You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用str.findall生成新列后,如何填充匹配失败的空值?

问题描述

我用以下代码从DataFrame的Description列提取关键词生成Category列:

dfc['Category'] = dfc['Description'].str.findall('Split|Transfer|REF', flags=re.IGNORECASE)

这段代码会提取Description列中出现的Split、Transfer或REF(忽略大小写),但无匹配项的单元格会返回空列表。我尝试过转换类型、替换为0或NaN,都无法填充空值。

完整示例代码如下:

import pandas as pd
import openpyxl
import datetime as dt
import numpy as np

dff = pd.DataFrame({'Date': ['20221003', '20221005'],
                   'Tran Type': ['BOOK TRANSFER CREDIT', 'ACH DEBIT'],
                   'Debit Amount': [0.00, -220000.00],
                   'Credit Amount': [182.90, 0.0],
                   'Description': ['BOOK CREDIT FROM ACCOUNT 98743447', 'USREF2448 ACH OFFSET'],
                   'Amount': [-220000.00, 182.90]})

import re
dff['Category'] = dff['Description'].str.findall('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE)

示例中,我希望第一行的Category列显示“Other”,第二行保留匹配到的REF。请问能不能在findall语句里加入逻辑设置默认值“Other”,或者后续替换空单元格?

解决方案

方式一:生成列时直接处理默认值

str.findall返回的是列表,空列表代表无匹配项。可以用apply判断列表是否为空,为空则返回['Other'],否则保留匹配结果:

dff['Category'] = dff['Description'].str.findall('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE).apply(lambda x: x if x else ['Other'])

如果希望Category是字符串类型(多匹配项用逗号分隔,无匹配则为Other),可以修改为:

dff['Category'] = dff['Description'].str.findall('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE).apply(lambda x: ', '.join(x) if x else 'Other')

方式二:生成列后替换空值

先执行原提取代码,再针对空列表做替换:

使用replace方法

直接匹配空列表并替换:

dff['Category'] = dff['Category'].replace([[]], 'Other')

使用mask方法

通过判断列表长度是否为0来替换:

dff['Category'] = dff['Category'].mask(dff['Category'].str.len() == 0, 'Other')

若需要将列表转为字符串后再处理:

# 先把列表转为逗号分隔的字符串
dff['Category'] = dff['Category'].apply(', '.join)
# 替换空字符串为Other
dff['Category'] = dff['Category'].replace('', 'Other')

内容的提问来源于stack exchange,提问作者Tomalak2Pi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:20:32