【问题标题】:Pandas: drop non-integer dataPandas:丢弃非整数数据
【发布时间】:2017-08-08 14:00:36
【问题描述】:

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

【问题讨论】:

    标签: python pandas data-cleaning


    【解决方案1】:

    我喜欢

    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
    

    所以要过滤,我们可以使用demo列'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]
    

    【讨论】:

    • 但是这个专栏里有string的类型,不知道//这样行不行?
    • @piRSquared - 楼层划分很好
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多