本文介绍如何使用 NumPy 的 np.where 函数和 Pandas 的字符串处理方法,从包含特定字符串的 DataFrame 列中提取数据,并将提取的数据分配到相应的列。重点在于结合 str.contains 和 str.extract 方法,以及正确构造正则表达式,以应对字段内容不一致的情况。
提取数据并分配到新列
假设你有一个 Pandas DataFrame,其中一列(例如 “Notes”)包含描述性文本,并且你希望根据文本中出现的特定关键词提取相关数值,并将这些数值分配到 DataFrame 的新列中。例如,”Notes” 列可能包含诸如 “Hit woodwork: 1” 或 “Big chances missed: 2” 之类的字符串,而你希望提取 “woodwork” 和 “Big chances missed” 对应的数值。
以下是如何使用 np.where 和正则表达式来实现此目的:
import pandas as pd import numpy as np # 示例 DataFrame data = {'Pl_Name': ['Leny Yoro', 'Tiago Santos', 'Adam Ounas', 'Alexsandro Ribeiro', 'Nabil Bentaleb', 'Edon Zhegrova', 'Ismaily', 'Rémy Cabella', 'Benjamin André', 'Angel Gomes', 'Ivan Cavaleiro', 'Lucas Chevalier', 'Samuel Umtiti', 'Jonathan David'], 'Notes': ['-', '-', 'Hit woodwork: 1', '-', '-', 'Big chances missed: 1', '-', 'Hit woodwork: 1Big chances missed: 1', '-', '-', '-', '-', '-', 'Big chances missed: 2'], 'Woodwork': [''] * 14, 'Msd Pen': [''] * 14, 'Big_Chances': [''] * 14, 'Created': [''] * 14} df = pd.DataFrame(data) # 提取 "Woodwork" 的数值 df["Woodwork"] = np.where(df['Notes'].str.contains('Hit woodwork', regex=False), df['Notes'].str.extract(r'(?<=Hit woodwork: )(d+)', expand=False), '') # 提取 "Big chances missed" 的数值 df["Big_Chances"] = np.where(df['Notes'].str.contains('Big chances missed', regex=False), df['Notes'].str.extract(r'(?<=Big chances missed: )(d+)', expand=False), '') print(df)
代码解释:
- 导入必要的库: 导入 pandas 用于数据处理和 numpy 用于条件判断。
- np.where 函数: np.where(condition, x, y) 是一个 NumPy 函数,它根据 condition 返回 x 或 y。如果 condition 为真,则返回 x,否则返回 y。
- df[‘Notes’].str.contains(‘Hit woodwork’, regex=False): 使用 Pandas 的字符串方法 str.contains 检查 ‘Notes’ 列中的每个字符串是否包含 “Hit woodwork”。 regex=False 参数表示将 “Hit woodwork” 视为普通字符串,而不是正则表达式。这可以避免正则表达式的特殊字符带来的问题,并提高效率。
- df[‘Notes’].str.extract(r'(? 使用 Pandas 的字符串方法 str.extract 从 ‘Notes’ 列中提取匹配正则表达式的子字符串。
- r'(?
- (?
- (d+) 匹配一个或多个数字,并将其捕获到一个组中。+ 确保提取所有连续的数字,而不仅仅是第一个。
- expand=False 参数确保返回一个 Series,而不是一个 DataFrame。
- 赋值给新列: 提取到的数值被赋值给 DataFrame 中名为 “Woodwork” 和 “Big_Chances” 的新列。
正则表达式的注意事项
- (? 这个结构允许你匹配前面有特定字符串的文本,但不将该字符串包含在匹配结果中。例如,(?
- (d+) (匹配一个或多个数字): d 匹配任何数字 (0-9)。 + 确保匹配一个或多个连续的数字。 重要的是使用 +,这样如果数值包含多个数字,它们都会被提取出来。
- regex=False: 如果搜索的字符串不包含正则表达式的特殊字符,并且你希望提高性能,则可以使用 regex=False。
总结
通过结合 np.where、str.contains 和 str.extract,你可以有效地从 Pandas DataFrame 的文本列中提取信息,并将其组织到新的列中。 正确构造正则表达式是关键,需要考虑到目标字符串的上下文和可能的变化。 此外,使用 regex=False 在适当的情况下可以提高代码的效率。
评论(已关闭)
评论已关闭