熊猫:丢弃非整数数据

时间:2017-03-17 06:01:26

标签: python pandas data-cleaning

我有数据集,我在其中读取数据,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,对我来说效果很好,但感觉有点太多了。我想知道是否有更好的方法?

1 个答案:

答案 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]