我有数据集,我在其中读取数据,df.dir.value_counts()
返回
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.按isdigit()
选择,然后进行向下转换
df = df[df['dir'].apply(lambda x: str(x).isdigit())]
df['dir']=pd.to_numeric(df['dir'], downcast='integer', errors='coerce')
这是来自Drop rows if value in a specific column is not an integer in pandas dataframe,对我来说效果很好,但感觉有点太多了。我想知道是否有更好的方法?
答案 0 :(得分:3)
我喜欢
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
任何整数都应该等于自己的楼层除以1。
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]