有一个像下面这样的数据框,它有一个不干净的列“ id”,它应该是数字列
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列中的每个值:
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的方法,它比与施加慢几乎两倍np.isnumeric于str列。另外,我使用pandas添加了选项,str.isnumeric它键入的次数更少,但使用起来还是更快pd.to_numeric。但是pd.to_numeric更笼统,因为它可以与任何数据类型一起使用(不仅限于字符串)。
pd.to_numeric
apply
np.isnumeric
str
str.isnumeric
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)