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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:57:10