如果列包含特定字符串,我如何使用str.contains()方法检查列,如果在另一列中为true,则指定值?从本质上讲,我试图在SQL中模仿一个CASE WHEN LIEN THEN语法但在pandas中。对python和pandas来说真的很新,并感谢任何帮助!从本质上讲,我想搜索“来源”#39;对于视频,音频,默认和如果找到,则类型将是视频,音频,默认相应。我希望这是有道理的!
Source Type
video1393x2352_high video
audiowefxwrwf_low audio
default2325_none default
23234_audio audio
答案 0 :(得分:3)
使用str.extract方法...将正则表达式作为参数...将匹配的组作为字符串返回...
df['Type'] = df.Source.str.extract('(video|audio|default)')
对于某些区分大小写,您可以添加...
df['Type'] = df.Source.str.lower().str.extract('(video|audio|default)')
示例,包括不匹配......
In [24]: %paste
import pandas as pd
data = """
Source
video1393x2352_high
audiowefxwrwf_low
default2325_none
23234_audio
complete_crap
AUDIO_upper_case_test"""
from StringIO import StringIO # import from io for python 3
df = pd.read_csv(StringIO(data), header=0, index_col=None)
df['Type'] = df.Source.str.lower().str.extract('(video|audio|default)')
## -- End pasted text --
In [25]: df
Out[25]:
Source Type
0 video1393x2352_high video
1 audiowefxwrwf_low audio
2 default2325_none default
3 23234_audio audio
4 complete_crap NaN
5 AUDIO_upper_case_test audio
答案 1 :(得分:0)
尝试使用numpy.where
或pandas.DataFrame.where
。两者都采用布尔数组并基于此有条件地分配。
In [4]: np.where([True, False, True], 3, 4)
Out[4]: array([3, 4, 3])
http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html
您将使用str.contains构造布尔数组,然后将其传递给where方法。
答案 2 :(得分:0)
尝试类似: -
import re
input_values = ['video1393x2352_high', 'audiowefxwrwf_low', 'default2325_none', '23234_audio']
pattern = re.compile('audio|video|default')
res_dict = {}
for input_val in input_values:
type = pattern.findall(input_val)
if type:
res_dict[input_val] = type[0]
print res_dict #{'23234_audio': 'audio', 'audiowefxwrwf_low': 'audio', 'video1393x2352_high': 'video', 'default2325_none': 'default'}