如果与单词匹配,则用列表替换pandas Dataframe列值

时间:2019-01-29 09:56:51

标签: python pandas dataframe

我有一个这样的颜色列表:

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

我有一个这样的数据框:

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

我想将col2color列表进行匹配。如果col2的任何单词与color列表的元素匹配,请用列表值替换。

结果数据帧将为

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

使用熊猫最有效的方法是什么?

2 个答案:

答案 0 :(得分:1)

对正则表达式|使用Series.str.extract的连接值,其中OR的正则表达式NaN,最后添加fillna替换原始列中的不匹配值(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 s):

10.0.0.36 - - [28/Jan/2019:09:12:19 +0000] "GET /myTransform.json?outSrs=epsg:3857&points=2.324456,48.798607;-0.609223,49.093723;2.324456,48.798607;-0.609223,49.093723 HTTP/1.1" 200 236

答案 1 :(得分:1)

使用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

try_except

  

如果颜色不匹配,如何保持原始颜色?一世   不想在那里有nan值。

这由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. 自动处理:

{{1}}

有关为何应将列表理解视为竞争性选择的更多信息,请检查For loops with pandas - When should I care?