Определить определенную последовательность строки в столбце из списка - PullRequest
3 голосов
/ 21 марта 2019

Я пытаюсь извлечь определенные строки, используя список.Возможно ли это в Python?

У меня есть этот список здесь:

currency = ['SGD', 'GBP', 'USD', 'EUR']

И если любая из этих строк появится в столбце, я бы хотел, чтобы новый столбец был создан с помощьюсоответствующая валюта.Это мой предполагаемый вывод:

Предполагаемый вывод

Name         Currency        Currency_updated    
0   Tom    RANDOM_SGD_2017         SGD
1   nick    TEST_EUR_1381          EUR
2   krish   FORFUN GBP             GBP
3   jack    NAs                    <blank>

Воспроизводимый пример

import pandas as pd 

data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs']} 

df = pd.DataFrame(data) 

DataframeИспользуется

     Name       Currency
0   Tom RANDOM_SGD_2017
1   nick    TEST_EUR_1381
2   krish   FORFUN GBP
3   jack    NAs

Ответы [ 4 ]

3 голосов
/ 21 марта 2019

Другим методом может быть использование re.search ()

import re
df['Currency_updated'] = df['Currency'].apply(lambda x: re.search('|'.join(currency), x).group(0) if x!='NAs' else None)
3 голосов
/ 21 марта 2019

Используйте Series.str.extract с join и | для регулярных выражений OR - 'SGD|GBP|USD|EUR' означает 'SGD' or 'GBP' or 'USD' or 'EUR'

pat = '|'.join(currency)
df['Currency_updated'] = df['Currency'].str.extract('('+ pat + ')', expand=False)
print (df)
    Name         Currency Currency_updated
0    Tom  RANDOM_SGD_2017              SGD
1   nick    TEST_EUR_1381              EUR
2  krish       FORFUN GBP              GBP
3   jack              NAs              NaN
2 голосов
/ 21 марта 2019

Вы можете создать функцию, которая работает со строками вашего фрейма данных:

import pandas as pd

def f(row):
  for elem in currency:
      if elem in row['Currency']:
           return elem

currency = ['SGD', 'GBP', 'USD', 'EUR']
data = {'Name':['Tom', 'nick', 'krish', 'jack'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs']}

df = pd.DataFrame(data)
df['Currency_Updated'] = df.apply(f, axis=1)
print(df)

OUTPUT :

    Name         Currency Currency_Updated
0    Tom  RANDOM_SGD_2017              SGD
1   nick    TEST_EUR_1381              EUR
2  krish       FORFUN GBP              GBP
3   jack              NAs             None
1 голос
/ 21 марта 2019

Я предлагаю использовать str.extract с

(?<![^\W_])(SGD|GBP|USD|EUR)(?![^\W_])

См. Демоверсию regex .

Обратите внимание, что (?<![^\W_]) / (?![^\W_]) - это недвусмысленные границы слова, которые также рассматривают _ (подчеркивание) как "несловесные" символы, поэтому EUR в _EUR_ считается целым словом.

В Python регулярное выражение может быть построено с использованием r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency))), с re.escape, на тот случай, если у вас могут быть $ или другие специальные символы в именах валют, например CA$.

import re
import pandas as pd

data = {'Name':['Tom', 'nick', 'krish', 'jack', 'meg', 'sarah'], 'Currency':['RANDOM_SGD_2017', 'TEST_EUR_1381', 'FORFUN GBP', 'NAs', 'More fun in EUROPE', 'And MUSDA thing']}
currency = ['SGD', 'GBP', 'USD', 'EUR']
df = pd.DataFrame(data)

rx = r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency)))
df['Currency_updated'] = df['Currency'].str.extract(rx, expand=False)

Выход:

>>> df
    Name            Currency Currency_updated
0    Tom     RANDOM_SGD_2017              SGD
1   nick       TEST_EUR_1381              EUR
2  krish          FORFUN GBP              GBP
3   jack                 NAs              NaN
4    meg  More fun in EUROPE              NaN
5  sarah     And MUSDA thing              NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...