修改熊猫数据框中的字符串

时间:2020-05-05 23:08:18

标签: 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      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)

但是我不知道如何将它应用于每一行。

2 个答案:

答案 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]