有一个如下所示的数据框,它有一个不干净的列’id’,它应该是数字列 id, name1, A2, B3, Ctt, D4, E5, Fde, G 是否有一种简洁的方法来删除行,因为tt和de不是数值 tt,Dde,G 使数据帧干净? id, name1
id, name 1, A 2, B 3, C tt, D 4, E 5, F de, G
是否有一种简洁的方法来删除行,因为tt和de不是数值
tt,D de,G
使数据帧干净?
id, name 1, A 2, B 3, C 4, E 5, F您可以使用字符串
isnumeric
的标准方法并将其应用于id列中的每个值:
import pandas as pd from io import StringIO data = """ id,name 1,A 2,B 3,C tt,D 4,E 5,F de,G """ df = pd.read_csv(StringIO(data)) In [55]: df Out[55]: id name 0 1 A 1 2 B 2 3 C 3 tt D 4 4 E 5 5 F 6 de G In [56]: df[df.id.apply(lambda x: x.isnumeric())] Out[56]: id name 0 1 A 1 2 B 2 3 C 4 4 E 5 5 F
或者如果你想使用id作为索引,你可以这样做:
In [61]: df[df.id.apply(lambda x: x.isnumeric())].set_index('id') Out[61]: name id 1 A 2 B 3 C 4 E 5 F
编辑.添加时间
虽然pd.to_numeric的情况不使用apply方法,但它几乎比为str列应用np.isnumeric慢两倍.此外,我添加了使用pandas str.isnumeric
的选项,它更少输入,然后使用pd.to_numeric更快.但pd.to_numeric更通用,因为它可以使用任何数据类型(不仅仅是字符串).
df_big = pd.concat([df]*10000) In [3]: df_big = pd.concat([df]*10000) In [4]: df_big.shape Out[4]: (70000, 2) In [5]: %timeit df_big[df_big.id.apply(lambda x: x.isnumeric())] 15.3 ms ± 2.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [6]: %timeit df_big[df_big.id.str.isnumeric()] 20.3 ms ± 171 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) In [7]: %timeit df_big[pd.to_numeric(df_big['id'], errors='coerce').notnull()] 29.9 ms ± 682 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)