我有一个数据框,其中一列为df ['Names']。如何找到所有名称以小写字母开头的行?
col1 Names
1564 abby
2289 Barry
等
我正在尝试使用正则表达式来实现这一目标,而没有运气。
答案 0 :(得分:2)
从str.lower
到
df[df.Names.str[0]==df.Names.str[0].str.lower()]
Out[173]:
col1 Names
0 1564 abby
另一种方法islower
df[df.Names.str[0].str.islower()]
Out[174]:
col1 Names
0 1564 abby
答案 1 :(得分:2)
使用string.ascii_lowercase
import string
df.loc[df.Names.str[0].isin(list(string.ascii_lowercase))]
使用regex
df[df.col.str.match('[a-z].*')]
一些时间
df = pd.DataFrame({'col': ['abc', 'Abc', 'dce', 'ADAE']})
df = pd.concat([df]*100)
%%timeit
a = df['col'].values.astype('<S1').view(np.int8)
df[(a >= 97) & (a <= 122)]
302 µs ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.col.str[0].isin(list(string.ascii_lowercase))
548 µs ± 13 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df[df.col.str.islower()]
559 µs ± 28.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df[df.col.str.match('[a-z].*')]
838 µs ± 17.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df[df.col.str[0]==df.col.str[0].str.lower()]
1.59 ms ± 65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
答案 2 :(得分:2)
如果我们在谈论性能,那么NumPy呢?将系列转换为字符串数组,提取第一个字符并比较ASCII值。
a = df['Names'].values.astype('<S1').view(np.int8)
df[(a >= 97) & (a <= 122)]
col1 Names
0 1564 abby
如果仅需要索引,请使用np.nonzero
:
(a >= 97) & (a <= 122)
# array([ True, False])
np.flatnonzero((a >= 97) & (a <= 122))
# array([0])