Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 修改数据帧中的字符串_String_Pandas - Fatal编程技术网

String 修改数据帧中的字符串

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',请选择股票代码行中的字符串 检查是否有任何小写字符 如果有小写字符,请在其前面添加连字符,并使字母大写,如下所示

我有一个名为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)


但是我不知道如果它满足这个条件,如何将它应用到每一行。

首先我们根据小写字母将字符串拆分,然后在前两部分和字符串的大写部分使用
-
作为分隔符将它们连接起来,然后添加最后一部分。最后,我们使用
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,可能会有带有小写字符的行,我不想碰它们,所以我在问题的第一部分提到了它