如何使用Pandas实现与“Like”等效的SQL

时间:2017-07-13 10:13:57

标签: python pandas

我可以使用正则表达式和isin()来执行SQL LIKE语句吗?

我有一个包含以下值的数据框:

my_list=['U*']
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
df['node']=0
print(df)
df.loc[df['countries'].isin(my_list),'node']=100
print(df)

我希望将美国和英国的节点值更改为100。

2 个答案:

答案 0 :(得分:0)

我认为您需要str.startswithstr.contains ^来启动条件字符串:

print (df[df.countries.str.startswith('U')])
  countries
0        US
1        UK

或者:

print (df[df.countries.str.contains('^U')])
  countries
0        US
1        UK

编辑:

df['node'] = np.where(df.countries.str.startswith('U'), 100, 0)
print (df)
  countries  node
0        US   100
1        UK   100
2   Germany     0
3     China     0

答案 1 :(得分:0)

要考虑列表或部分,您可以使用正则表达式:

countries = ['U.*', 'Ch.*']
countries_regexp = '^({})$'.format('|'.join(countries))
df[df.countries.str.match(countries_regexp)]

注意:matchcontains更严格,但在这种情况下都有效(尽管包含会在您获得实际组的情况下为匹配组提供警告)。

或者针对countries列表中的每个元素检查匹配项并合并生成的过滤器:

filters = [df.countries.str.match(pat) for pat in countries]
df[reduce(operator.or_, filters, False)]

第一个更快:

(1) 538 µs ± 25.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
(2) 1.3 ms ± 42.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)