String 修改数据帧中的字符串
我有一个名为df的数据帧String 修改数据帧中的字符串,string,pandas,String,Pandas,我有一个名为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 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)
但是我不知道如果它满足这个条件,如何将它应用到每一行。首先我们根据小写字母将字符串拆分,然后在前两部分和字符串的大写部分使用
-
作为分隔符将它们连接起来,然后添加最后一部分。最后,我们使用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
首先,我们根据小写字母将字符串拆分,然后在前两部分使用
-
作为分隔符将它们连接起来,并将字符串大写,然后添加最后一部分。最后,我们使用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
您可以将replace函数用于
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]
您可以将replace函数用于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]
是否可能有多个小写字母需要替换?不,只能有一个。是否有多个小写字母需要替换?否,只能有一行。嘿,对不起,在国家/地区只选择带“ST”的行怎么样,因为如果不是ST,可能会有带小写字符的行,我不想碰这些行,我在问题的第一部分提到了。嘿,对不起,在国家/地区只选择带“ST”的行怎么样,因为如果不是ST,可能会有带有小写字符的行,我不想碰它们,所以我在问题的第一部分提到了它