Замените значения столбцов DataFrame в pandas списком, если он соответствует слову - PullRequest
0 голосов
/ 29 января 2019

У меня есть список таких цветов:

color = ['green', 'blue', 'red']

У меня есть такой кадр данных:

df:
col1        col2
 A        dark green
 B        sea blue
 C          blue
 D       exclusive red
 E          green
 F       pale red

Я хочу сопоставить col2 со списком color,Если какое-либо слово col2 соответствует элементу списка color, замените его значением списка.

Фрейм данных результата будет

 col1          col2
  A            green
  B            blue
  C            blue
  D            red
  E            green
  F            red

Что является наиболее эффективнымспособ сделать это с помощью панд?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

df['col2'] = df.col2.str.extract(f"({'|'.join(color)})", expand=False)
df

  col1   col2
0    A  green
1    B   blue
2    C   blue
3    D    red
4    E  green
5    F    red

Для повышения производительности вы можете использовать представление списка, в котором используется предварительно скомпилированный шаблон регулярных выражений для выполнения re.search:

import re

p = re.compile(rf"({'|'.join(color)})")
def try_extract(s):
    try:
        return p.search(s).group(1)
    except (TypeError, AttributeError):
        return s

df['col2'] = [try_extract(s) for s in df['col2']
df

  col1   col2
0    A  green
1    B   blue
2    C   blue
3    D    red
4    E  green
5    F    red

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

Это автоматически обрабатывается try_except:

df2 = df.append(pd.Series(
    {'col1': 'G', 'col2': 'something else'}), ignore_index=True)
df2['col2'] = [try_extract(s) for s in df2['col2']]
df2

  col1            col2
0    A           green
1    B            blue
2    C            blue
3    D             red
4    E           green
5    F             red
6    G  something else   # other values are preserved.

Для получения дополнительной информации о том, почему понимание списков следует рассматривать как конкурентную альтернативу,Вы можете проверить Для петель с пандами - Когда я должен заботиться? .

0 голосов
/ 29 января 2019

Используйте Series.str.extract с объединенными значениями на | для регулярных выражений OR, последнее добавление fillna для замены несопоставленных значений (NaN с) на исходныестолбец:

print (df)
  col1           col2
0    A     dark green
1    B       sea blue
2    C           blue
3    D  exclusive red
4    E          green
5    F           pale <- not matched value

color=['green','blue','red']

pat = r'({})'.format('|'.join(color))
df['col2'] = df['col2'].str.extract(pat, expand=False).fillna(df['col2'])

print (df)
  col1   col2
0    A  green
1    B   blue
2    C   blue
3    D    red
4    E  green
5    F   pale
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...