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

如何从Pandas DataFrame的字符串列中提取基金类别?

嘿,这个需求我之前刚好处理过类似的,用Pandas结合正则表达式就能完美解决,咱们分情况来一步步搞:

首先,先模拟你的数据场景,方便你直接测试:

import pandas as pd

# 构造示例数据,包含你提到的各种情况
data = {
    'fund_name': [
        '1 Janus Henderson Research Fund Class N',
        '2 Calvert Equity Fund Class A',
        '3 Invesco Diversified Dividend Fund R5 Class',  # 类别在Class前面的特殊情况
        '4 Some Random Fund Without Class Tag',
        '5 Federated Equity Income Fund, Inc. Class A Shares'
    ]
}
df = pd.DataFrame(data)

接下来核心是写一个能覆盖两种核心情况的正则表达式:一种是Class后面跟着类别(比如Class N、Class A Shares),另一种是类别在Class前面(比如R5 Class)。然后用Pandas的str.extract方法提取,没匹配到的自动会设为NaN(也就是你要的NA)。

代码如下:

# 正则表达式:匹配两种模式,捕获组会提取对应的类别部分
pattern = r'(Class\s+\w+(?:\s+\w+)?|\w+\s+Class)'

# 提取基金类别,无匹配则为NaN
df['fund_class'] = df['fund_name'].str.extract(pattern, expand=False)

# 可选:如果想把「R5 Class」这种格式统一成「Class R5」的风格,加这一步
df['fund_class'] = df['fund_class'].apply(
    lambda x: f"Class {x.split()[0]}" if x and x.endswith('Class') else x
)

运行后你会得到这样的结果:

>>> df
                                            fund_name    fund_class
0              1 Janus Henderson Research Fund Class N       Class N
1                      2 Calvert Equity Fund Class A         Class A
2          3 Invesco Diversified Dividend Fund R5 Class       Class R5
3                  4 Some Random Fund Without Class Tag            NaN
4  5 Federated Equity Income Fund, Inc. Class A Shares  Class A Shares

简单解释下逻辑:

  • 正则里的Class\s+\w+(?:\s+\w+)?:专门匹配Class后面跟着1个或多个单词的情况(比如Class A Shares这种带多个词的类别也能捕获);
  • \w+\s+Class:匹配类别在Class前面的情况(比如R5 Class);
  • str.extract只会提取第一个匹配到的内容,没匹配到就返回NaN,完美符合你“不含Class设为NA”的要求;
  • 最后的apply是可选操作,用来统一格式,如果你不需要统一,直接去掉就行。

如果你的数据里还有更特殊的格式(比如类别带连字符、数字组合),可以把正则里的\w+改成[\w-]+,这样就能匹配带连字符的类别了。

内容的提问来源于stack exchange,提问作者Akshay Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:53:16