基于Market列值修改DataFrame中Ticker列值的技术求助
解决Ticker列替换与条件追加问题
我确信这个问题有非常简单的解决方案,但我已经花了好几个小时尝试解决却无果!
复现用DataFrame
import pandas as pd data = {"Market": ['NYSE','TSX','SPTSX','TSX60','SP500'],"Ticker": ['AGM.A','AEM','CCL.B','BBD-B','BRK.B']} df = pd.DataFrame(data)
需求
- 将Ticker列中的所有“.”替换为“-”
- 若Market列的字符串中包含“TSX”,则在对应Ticker列值后追加“.TO”
期望最终Ticker列结果:AGM-A, AEM.TO, CCL-B.TO, BBD-B.TO, BRK-B
我尝试过但未成功的写法
if df['Market'].str.find('TSX').any(): df['Ticker'] = df['Ticker'].str.replace('.','-') + '.TO' for x in df['Market']: if x.str.find('TSX').any(): data['Ticker'] = data['Ticker']+".TO" df.loc[df.Market.str.contains('TSX').any(), 'Ticker'] = df.Ticker + ".TO" #df['Ticker'] = df['Ticker'].astype(str) + '.TO'
正确解决方案
核心问题是错误使用了.any(),导致把整列的判断结果合并为单个布尔值,从而修改了所有行而非仅符合条件的行。正确实现分两步:
- 先全局替换Ticker中的
.为- - 精准定位Market包含
TSX的行,追加.TO
完整代码:
# 第一步:替换所有.为-(regex=False避免正则匹配问题) df['Ticker'] = df['Ticker'].str.replace('.', '-', regex=False) # 第二步:给Market包含TSX的行追加.TO df.loc[df['Market'].str.contains('TSX'), 'Ticker'] += '.TO'
运行后输出的Ticker列:
0 AGM-A 1 AEM.TO 2 CCL-B.TO 3 BBD-B.TO 4 BRK-B Name: Ticker, dtype: object
错误代码解析
.any()会将Series的判断结果合并为一个布尔值(只要有一个元素符合就返回True),导致所有行都被修改,而非仅目标行- 循环遍历
df['Market']时,x是单个字符串,没有.str属性,会触发AttributeError str.find返回的是子串的索引位置(找不到返回-1),用.any()判断是否包含的逻辑错误,应该直接用str.contains做包含判断
内容的提问来源于stack exchange,提问作者Jeff C
相关产品推荐
相关产品推荐

