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]
我有数据集,我在其中读取数据,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]