我有一个这样的颜色列表:
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
使用熊猫最有效的方法是什么?
答案 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?。