如何从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
相关产品推荐
相关产品推荐

