使用np.where与contains提取DataFrame数据遇NaN问题求助
解决方法
先给你揪出当前代码的问题:
- 代码里写的是
Att_Notes,但实际要处理的是Notes列,这直接导致匹配到了也拿不到数据,返回NaN - 正则里的
Hit woodwork :带空格,但你的Notes列是无空格拼接的字符串,关键词和冒号之间应该没空格,所以正则要改成不带空格的
单个关键词的修正代码
比如处理"Hit woodwork":
import numpy as np import pandas as pd # 修正列名和正则 Players_A['Woodwork'] = np.where( Players_A['Notes'].str.contains('Hit woodwork', regex=True), Players_A['Notes'].str.extract(r'(?<=Hit woodwork:)(\d)', expand=False), 0 # 用0代替空字符串,更符合统计列的数字类型 ).astype(int)
这里加了expand=False让extract返回Series而不是DataFrame,避免嵌套结构,最后转成int类型保证列是数字格式。
多个关键词的批量处理
如果要处理多个关键词,比如"Hit woodwork"对应"Woodwork"列,"Big chances missed"对应"Big_chances_missed"列,直接写循环更方便:
# 定义关键词和对应列名的映射 keyword_col_map = { 'Hit woodwork': 'Woodwork', 'Big chances missed': 'Big_chances_missed' } for keyword, col_name in keyword_col_map.items(): # 构造正则:匹配关键词+冒号后的数字,关键词本身的空格保留(只是不同动作之间无空格) regex_pattern = rf'(?<={keyword}:)(\d)' # 提取数字,没有匹配到的填0 Players_A[col_name] = Players_A['Notes'].str.extract(regex_pattern, expand=False).fillna(0).astype(int)
这个方法不管关键词在字符串里的位置在哪,都能精准提取冒号后的数字,而且批量处理更高效。
补充说明
如果你的Notes列里关键词和冒号之间偶尔有空格,正则可以改成rf'(?<={keyword}\s?:)(\d)',\s?表示匹配0或1个空格,兼容性更强。
内容的提问来源于stack exchange,提问作者filipakous
相关产品推荐
相关产品推荐

