Как проверить строку, содержащую элементы в списке, и назначить целевой элемент другому столбцу с помощью Pandas - PullRequest
2 голосов
/ 23 мая 2019

У меня есть один столбец со списком названий компаний .Некоторые из этих названий содержат названия стран (например, «Китай» в «China A1», «Finland» в «C1 in Finland»).Я хочу извлечь принадлежащие им страны на основе названия компании и предварительно определенного списка, состоящего из названий стран.

Исходный кадр данных df выглядит следующим образом

    Company name    Country
0   China A1        
1   Australia-A2        
2   Belgium_C1      
3   C1  in  Finland
4   D1  of  Greece
5   E2  for Pakistan

Пока я могу только придумать неэффективный метод.Вот мой код:

country_list = ['China','America','Greece','Pakistan','Finland','Belgium','Japan','British','Australia']
for t in country_list:
    df.loc[df['company name'].contains(t),'country']=t

Результат показывает что-то вроде

    Company name    Country
0   China A1        China
1   Australia-A2    Australia   
2   Belgium_C1      Belgium
3   C1  in  Finland Finland
4   D1  of  Greece  Greece
5   E2  for Pakistan Pakistan

Я думал, что когда список стран содержит большое количество элементов, то есть стран, это будет времяпотребление через метод цикла.Есть ли более простой метод решения моей проблемы?

Ответы [ 4 ]

2 голосов
/ 23 мая 2019

Возможно, используйте findall, если в одной ячейке более одного названия страны

df["Company name"].str.findall('|'.join(country_list)).str[0]
Out[758]: 
0        China
1    Australia
2      Belgium
3      Finland
4       Greece
5     Pakistan
Name: Company name, dtype: object
2 голосов
/ 23 мая 2019

Использование str.extract с Regex

Ex:

import pandas as pd
country_list = ['China','America','Greece','Pakistan','Finland','Belgium','Japan','British','Australia']

df = pd.read_csv(filename)
df["Country"] = df["Company_name"].str.extract("("+"|".join(country_list)+ ")")
print(df)

Выход:

           Company_name    Country
0      China A1              China
1  Australia-A2          Australia
2      Belgium_C1          Belgium
3       C1  in  Finland    Finland
4        D1  of  Greece     Greece
5      E2  for Pakistan   Pakistan
2 голосов
/ 23 мая 2019

Вам нужно series.str.extract() здесь:

pat = r'({})'.format('|'.join(country_list))
# pat-->'(China|America|Greece|Pakistan|Finland|Belgium|Japan|British|Australia)'
df['Country']=df['Company name'].str.extract(pat, expand=False)
2 голосов
/ 23 мая 2019

Вот один из способов использования str.extract:

df['Country'] = df['Company name'].str.extract('('+'|'.join(country_list)+')')

       Company name    Country
0          China A1      China
1      Australia-A2  Australia
2        Belgium_C1    Belgium
3   C1  in  Finland    Finland
4    D1  of  Greece     Greece
5  E2  for Pakistan   Pakistan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...