Pandas extract()返回NaN:如何提取U1-U9并分组DataFrame列?
解决从Pandas DataFrame提取U1-U9并分组的问题
问题分析
- 原
str.match正则r'(U\s*\d)'会匹配U25这类不符合要求的行,因为它仅检查字符串开头是否存在U+空格+数字,不限制数字后是否还有其他字符,且允许数字0。 - 原
str.extract用法错误:直接将提取结果与True比较会返回NaN,因为str.extract返回的是匹配到的字符串(无匹配则为NaN),而非布尔值。
正确步骤
1. 筛选包含有效U1-U9的行
使用str.contains配合精准正则,确保只匹配U后接可选空格和1-9的单个数字,且避免匹配U25这类长数字:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'column1': ['U 1', 'U9', 'U25', 'U 3 / U 2', 'U0', 'X5'], 'value': [10, 20, 30, 40, 50, 60] }) # 筛选符合条件的行:U后接可选空格+1-9的数字,且是独立项(避免U25) filtered_df = df[df['column1'].str.contains(r'\bU\s*[1-9]\b', na=False)] print("筛选后的行:") print(filtered_df)
2. 提取并标准化U1-U9值
提取匹配的内容,并统一格式(去除U和数字间的空格):
# 提取第一个匹配的U1-U9值,去除空格标准化 filtered_df['extracted_u'] = filtered_df['column1'].str.extract(r'(U\s*[1-9])', expand=False).str.replace(r'\s', '', regex=True) # 若一行有多个匹配值(如"U 3 / U 2"),可使用extractall+explode拆分 multi_matches = filtered_df.copy() multi_matches['extracted_u'] = multi_matches['column1'].str.extractall(r'(U\s*[1-9])')[0].str.replace(r'\s', '', regex=True).groupby(level=0).apply(list) multi_matches = multi_matches.explode('extracted_u') print("\n拆分多匹配后的行:") print(multi_matches)
3. 基于提取值分组
使用groupby对其他列进行分组聚合:
# 按提取的U值分组,计算value列的总和 grouped = filtered_df.groupby('extracted_u')['value'].sum().reset_index() print("\n分组聚合结果:") print(grouped)
关键正则说明
\b:单词边界,确保U和数字是独立的项,避免匹配U25中的U2。U\s*[1-9]:匹配U后接0个或多个空格,再接1-9的单个数字(排除U0)。
内容的提问来源于stack exchange,提问作者Maryam Mohebbi
相关产品推荐
相关产品推荐

