Pandas: 丢弃非整数数据

Pandas: drop non-integer data

我有数据集,我在其中读取数据,df.dir.value_counts() returns

169      23042
170      22934
168      22873
316      22872
315      22809
171      22731
317      22586
323      22561
318      22530

         ...  
0.069        1
0.167        1
0557         1
0.093        1
1455         1
0.130        1
0.683        1
2211         1
3.714        1
1.093        1
0819         1
0.183        1
0.110        1
2241         1
0.34         1
0.330        1
0.563        1
60+9         1
0.910        1
0.232        1
1410         1
0.490        1
0.107        1
1.257        1
1704         1
0.491        1
1.180        1
5-230        1
1735         1
1.384        1

dir栏是关于方向的,数据应该是整数,范围是(0,361)。如您所见,value_counts()列表末尾有很多错误数据。

我想知道,如何删除非整数数据?


有一些可能的方法

1.read_csv 作为整数并抛出所有非整数数据

df = pd.read_csv("/data.dat", names = ['time', 'dir'], dtype={'dir': int}})

但是有些字符串类的错误数据,比如60+9,会导致错误。不知道怎么处理。

2.Select by isdigit(),然后进行向下转换

df = df[df['dir'].apply(lambda x: str(x).isdigit())]
df['dir']=pd.to_numeric(df['dir'], downcast='integer', errors='coerce')

这来自 ,对我来说效果很好,但感觉有点太多了。我想知道是否有更好的方法?

我喜欢

df.dir[df.dir == df.dir // 1]

工作原理

考虑数据帧df

df = pd.DataFrame(dict(dir=[1, 1.5, 2, 2.5]))
print(df)

   dir
0  1.0
1  1.5
2  2.0
3  2.5

任何整数都应该等于它本身的底数除以一。

df.assign(floor_div=df.dir // 1)

   dir  floor_div
0  1.0        1.0
1  1.5        1.0
2  2.0        2.0
3  2.5        2.0

所以我们可以测试它们何时相等

df.assign(
    floor_div=df.dir // 1,
    is_int=df.dir // 1 == df.dir
)

   dir  floor_div is_int
0  1.0        1.0   True
1  1.5        1.0  False
2  2.0        2.0   True
3  2.5        2.0  False

所以要过滤,我们可以使用演示列中的布尔掩码'is_int'

df.dir[df.dir == df.dir // 1]

0    1.0
2    2.0
Name: dir, dtype: float64

如果这一栏有字符串,那么可以合并pd.to_numeric

df.dir = pd.to_numeric(df.dir, 'coerce')
df.dir[df.dir == df.dir // 1]