在Pandas中提取子串并结合列数据计算交易月数新列的问题
嘿,我来帮你搞定这个交易月数计算的问题!先理清楚核心需求:从Duration字符串里提取时间信息,必要时结合Issues in 1 year列算出对应的交易月数。我先给你一套通用的解决框架,再针对常见的坑给出修正方案,你可以对照自己的代码调整~
核心思路拆解
第一步:解析Duration字符串里的时间信息
首先得把Duration里的数字和时间单位(月/年)提取出来,正则表达式是最靠谱的方式,能兼容大部分格式。比如处理"3 months"、"1 year"、"6 YEARS"这种写法:
import re import pandas as pd def extract_duration_details(duration_str): # 匹配数字+单位,兼容缩写(比如mo/yr)和大小写 match = re.search(r'(\d+)\s*(month|mo|year|yr)s?', duration_str, re.IGNORECASE) if match: num = int(match.group(1)) # 把缩写统一转换成标准单位 unit_map = {'mo': 'month', 'yr': 'year'} unit = unit_map.get(match.group(2).lower(), match.group(2).lower()) return num, unit # 解析失败时返回空值 return None, None # 把解析结果拆成两列临时存储 df[['duration_num', 'duration_unit']] = df['Duration'].apply(lambda x: pd.Series(extract_duration_details(x)))
第二步:结合Issues in 1 year计算交易月数
这里要明确你的业务逻辑:什么时候需要用Issues in 1 year?比如如果Duration是“1 year”,但Issues in 1 year是6,意味着每2个月交易一次,月数就是2。我写一个通用的计算函数,你可以根据实际需求调整:
def compute_trade_months(row): # 优先用Duration直接转换 if row['duration_unit'] == 'month': return row['duration_num'] elif row['duration_unit'] == 'year': # 有有效Issues数据时,用12除以年交易次数得到月数 if pd.notna(row['Issues in 1 year']) and row['Issues in 1 year'] > 0: # 要整数就用//,要小数就用/ return 12 // row['Issues in 1 year'] else: # 没有Issues数据时,默认按每年12次交易(每月1次) return 1 # Duration解析失败的情况, fallback到用Issues计算 else: if pd.notna(row['Issues in 1 year']) and row['Issues in 1 year'] > 0: return 12 // row['Issues in 1 year'] else: # 完全没有数据时返回空值,也可以设默认值比如1 return None # 生成最终的交易月数列 df['Trade_Months'] = df.apply(compute_trade_months, axis=1)
常见问题修正方案
如果你的现有代码遇到了问题,大概率是下面这些场景:
- 问题1:
Duration格式太乱(比如"3m"、"1Y")
调整正则表达式里的匹配规则,把所有可能的缩写加进去,比如把正则改成r'(\d+)\s*(month|mo|m|year|yr|y)s?',同时更新unit_map对应上。 - 问题2:
Issues in 1 year有缺失值或0
先给缺失值填充合理的默认值,比如:# 假设默认每年12次交易,填充缺失值 df['Issues in 1 year'] = df['Issues in 1 year'].fillna(12) # 把0替换成12,避免除以0 df['Issues in 1 year'] = df['Issues in 1 year'].replace(0, 12) - 问题3:计算出的月数不符合预期
检查你的业务逻辑:比如如果Duration是“6 months”,是不是直接返回6?如果Issues in 1 year是4,是不是应该返回3(12/4)?根据实际需求修改compute_trade_months里的判断逻辑就行。
如果还有具体的报错或者某行数据计算不对,把你的现有代码和样例数据贴出来,我再帮你针对性调整!
内容的提问来源于stack exchange,提问作者G-Money
相关产品推荐
相关产品推荐

