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

2024-04-19 10:35:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我有这样一个数据帧:

^{pr2}$

我想将col2color列表匹配。如果col2的任何单词与color列表的元素匹配,请将其替换为lists值。在

结果数据帧将是

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

用熊猫做这件事最有效的方法是什么?在


Tags: 数据方法元素列表颜色greenbluered
2条回答

^{}|连接的值一起使用|表示regex OR,最后一个add ^{}将不匹配的值(NaNs)替换为原始列:

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

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

为了获得更好的性能,您可以使用使用预编译regex模式的列表理解来执行re.search

^{pr2}$

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

If the color doesn't match how to keep keep the original color? I don't want nan values there.

这由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.

关于为什么列表理解应该被视为一种竞争性的替代方案的更多信息,您可以查看For loops with pandas - When should I care?。在

相关问题 更多 >