изменить строки в pandas кадре данных - PullRequest
0 голосов
/ 06 мая 2020

У меня есть следующий фрейм данных с именем 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 ]

2 голосов
/ 06 мая 2020

Сначала мы разделяем строки на основе строчных букв, затем соединяем их обратно с помощью - в качестве разделителя на первых двух частях и прописных букв, затем добавляем последнюю часть. Наконец, мы используем 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
0 голосов
/ 06 мая 2020

вы можете использовать функцию замены на 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...