使用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
相关产品推荐
相关产品推荐

