从列表中检测列中特定的字符串顺序

时间:2019-03-21 06:28:26

标签: python regex pandas

我正在尝试使用列表来提取特定的字符串。在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) 

使用的数据框

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

4 个答案:

答案 0 :(得分:3)

Series.str.extractjoin|一起使用正则表达式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

答案 1 :(得分:3)

另一种方法可能是使用re.search()

import re
df['Currency_updated'] = df['Currency'].apply(lambda x: re.search('|'.join(currency), x).group(0) if x!='NAs' else None)

答案 2 :(得分:2)

您可以创建一个对数据框的行进行操作的函数:

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)

输出

    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

答案 3 :(得分:1)

我建议将<active>true</active>

一起使用
str.extract

请参见regex demo

请注意,(?<![^\W_])(SGD|GBP|USD|EUR)(?![^\W_]) / (?<![^\W_])是明确的单词边界,也将(?![^\W_])(下划线)视为“非单词”字符,因此{{1 }}被视为一个完整的单词。

在Python中,可以使用_EUR构建正则表达式,以防万一您可能在货币名称中包含_EUR_或其他特殊字符,例如{{1} }。

r'(?<![^\W_])({})(?![^\W_])'.format('|'.join(map(re.escape, currency)))

输出:

re.escape