我有以下称为df的数据框
country ticker
01 ST ENRO.ST
02 ST ERICb.ST
03 ST BTSb.ST
04 US MSFT
05 HK 0070.HK
06 ST SAABb.ST
07 ST SaA.ST
我要执行以下操作
如果国家=='ST',则在代码行中选择字符串。
检查是否有小写字符。
如果有小写字符,则在其前面添加连字符,并使字母变为大写。
country ticker
01 ST ENRO.ST
02 ST ERIC-B.ST
03 ST BTS-B.ST
04 US MSFT
05 HK 0070.HK
06 ST SAAB-B.ST
07 ST S-AA.ST
如果只是一个字符串,我将执行以下操作
teststr = [char for char in "ERICb.ST"]:
for i,v in enumerate(teststr):
if teststr[i].islower():
mod = i
teststr[mod] = teststr[mod].upper()
teststr.insert(mod,'-')
teststr = ''.join(teststr)
但是我不知道如何将它应用于每一行。
答案 0 :(得分:2)
首先,我们根据小写字母拆分字符串,然后在前两部分使用-
作为分隔符将它们重新连接在一起,并在字符串中使用大写,然后添加最后一部分。最后,我们使用Series.where
仅修改country == ST
所在的行:
s1 = df['ticker'].str.split('([a-z])')
s2 = s1.str[:2].str.join('-').str.upper() + s1.str[2:].str.join('')
df['ticker'] = s2.where(df['country'].eq('ST'), df['ticker'])
country ticker
0 ST ENRO.ST
1 ST ERIC-B.ST
2 ST BTS-B.ST
3 US MSFT
4 HK 0070.HK
5 ST SAAB-B.ST
6 ST S-AA.ST
答案 1 :(得分:0)
您可以将替换功能与str.replace
repl = lambda x: '-'+x.group(0).upper()
df.loc[df.country.eq('ST'), 'ticker'] = (df.loc[df.country.eq('ST'), 'ticker']
.str.replace('([a-z])', repl))
Out[58]:
country ticker
1 ST ENRO.ST
2 ST ERIC-B.ST
3 ST BTS-B.ST
4 US MSFT
5 HK 0070.HK
6 ST SAAB-B.ST
7 ST S-AA.ST
注意:正如您所说的,每个字符串中只有一个小写字符,所以我使用模式[a-z]