Pandas 删除数据

创建DataFrame数据

import numpy as np
import pandas as pd

a = np.ones((12, 9))
for i in range(len(a)):
    a[i,:i] = np.nan

df = pd.DataFrame(data=a, columns=['one', 'two', 'three','four','five','six','seven','eight','nine'])
print(df)

运行结果如下:

    one  two  three  four  five  six  seven  eight  nine
0   1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1   NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2   NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN  NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN  NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

一、删除缺失值

pandas.DataFrame.dropna(axis, how= None, thresh, subset, inplace)

  • axis: default 0指行,1为列
  • how: {‘any’, ‘all’},default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的
  • thresh: int,保留含有int个非空值的行
  • subset: 对特定的列进行缺失值删除处理
  • inplace: 这个很常见,True表示直接在原数据上更改

1.1 按照行删除数据

1.1.1 删除空值对应的所有行

# 1. 存在空值,即删除该行
print(df.dropna(axis=0, how='any'))

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0

1.1.2 删除所有列数据都为空值的行

print(df.dropna(axis=0, how='all'))

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1  NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2  NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3  NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4  NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5  NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6  NaN  NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7  NaN  NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0

1.1.3 删除大于等于5个列中的数值为空值的行

print(df.dropna(axis=0, thresh=5))

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1  NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2  NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3  NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4  NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0

1.2 按照列删除数据

1.2.1 删除所有空值对应的行,并原地替换

df.dropna(inplace=True)
print(df)

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0

1.2.2 删除某些列中任意列中数值为空值对应的行

# 2. 删除 five, six 任意列中有空值对应的行,并原地替换
subset = ['five', 'six']
df.dropna(subset=subset, how='any', inplace=True)
print(df)

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1  NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2  NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3  NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4  NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0

1.2.3 删除某些列中所有列中数值都为空值对应的行

# 3. 删除 five, six 所有列都为空值对应的行
print(df.dropna(axis=0, how='all', subset=['five', 'six']))

执行结果如下:

   one  two  three  four  five  six  seven  eight  nine
0  1.0  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1  NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2  NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3  NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4  NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5  NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0

1.2.4 删除非空元素小于5个的列

# 4. 删除非空元素小于5个的列
print(d.dropna(thresh=5))

执行结果如下:

    five  six  seven  eight  nine
0    1.0  1.0    1.0    1.0   1.0
1    1.0  1.0    1.0    1.0   1.0
2    1.0  1.0    1.0    1.0   1.0
3    1.0  1.0    1.0    1.0   1.0
4    1.0  1.0    1.0    1.0   1.0
5    NaN  1.0    1.0    1.0   1.0
6    NaN  NaN    1.0    1.0   1.0
7    NaN  NaN    NaN    1.0   1.0
8    NaN  NaN    NaN    NaN   1.0
9    NaN  NaN    NaN    NaN   NaN
10   NaN  NaN    NaN    NaN   NaN
11   NaN  NaN    NaN    NaN   NaN

二、删除指定行列数据

pandas.DataFrame.drop(labels,axis=0,level=None,columns=None, inplace=False,errors=’raise’)

  • labels:接收string或array,代表要删除的行或列的标签(行名或列名)。无默认值
  • axis:接收0或1,代表操作的轴(行或列)。默认为0,代表行;1为列。
  • level:接收int或索引名,代表标签所在级别。默认为None
  • inplace:接收布尔值,代表操作是否对原数据生效,默认为False
  • errors:errors='raise’会让程序在labels接收到没有的行名或者列名时抛出错误导致程序停止运行,errors='ignore’会忽略没有的行名或者列名,只对存在的行名或者列名进行操作。默认为‘errors=‘raise’’。

2.1 删除1列

# 删除 one 列
print(df.drop(labels='age_level', axis=1))

执行结果如下:

    two  three  four  five  six  seven  eight  nine
0   1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1   1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2   NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.2 删除 第一行

print(df.drop(labels=0))

执行结果如下:

    one  two  three  four  five  six  seven  eight  nine
1   NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2   NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN  NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN  NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.3 同时删除多列

print(df.drop(labels=['one', 'two'], axis=1))

执行结果如下:

    three  four  five  six  seven  eight  nine
0     1.0   1.0   1.0  1.0    1.0    1.0   1.0
1     1.0   1.0   1.0  1.0    1.0    1.0   1.0
2     1.0   1.0   1.0  1.0    1.0    1.0   1.0
3     NaN   1.0   1.0  1.0    1.0    1.0   1.0
4     NaN   NaN   1.0  1.0    1.0    1.0   1.0
5     NaN   NaN   NaN  1.0    1.0    1.0   1.0
6     NaN   NaN   NaN  NaN    1.0    1.0   1.0
7     NaN   NaN   NaN  NaN    NaN    1.0   1.0
8     NaN   NaN   NaN  NaN    NaN    NaN   1.0
9     NaN   NaN   NaN  NaN    NaN    NaN   NaN
10    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.4 同时删除多行:删除第一行和第二行

print(df.drop(labels=range(2))) # 等价于df.drop(labels=[0,1])

执行结果如下:

    one  two  three  four  five  six  seven  eight  nine
2   NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN  NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN  NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.5 使用del 删除列

使用del删除列,且只能删除一列,不能同时删除多列

del df['one']
print(df)

执行结果如下:

    two  three  four  five  six  seven  eight  nine
0   1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
1   1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2   NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.6 删除缺失值占比大于70%的所有列

missing_df = ((df.isnull().sum())/df.shape[0])
missing_columns = (list(missing_df[missing_df >0.7].index))
print(df.drop(columns = list(missing_columns)))

执行结果如下:

    four  five  six  seven  eight  nine
0    1.0   1.0  1.0    1.0    1.0   1.0
1    1.0   1.0  1.0    1.0    1.0   1.0
2    1.0   1.0  1.0    1.0    1.0   1.0
3    1.0   1.0  1.0    1.0    1.0   1.0
4    NaN   1.0  1.0    1.0    1.0   1.0
5    NaN   NaN  1.0    1.0    1.0   1.0
6    NaN   NaN  NaN    1.0    1.0   1.0
7    NaN   NaN  NaN    NaN    1.0   1.0
8    NaN   NaN  NaN    NaN    NaN   1.0
9    NaN   NaN  NaN    NaN    NaN   NaN
10   NaN   NaN  NaN    NaN    NaN   NaN
11   NaN   NaN  NaN    NaN    NaN   NaN

2.7 删除满足条件的所有行

2.7.1 满足单条件的行数据删除

# 单条件删除:删除 one 列中值等于1.0的所有行
print(df.drop(df[df['one']==1.0].index))

执行结果如下:

    one  two  three  four  five  six  seven  eight  nine
1   NaN  1.0    1.0   1.0   1.0  1.0    1.0    1.0   1.0
2   NaN  NaN    1.0   1.0   1.0  1.0    1.0    1.0   1.0
3   NaN  NaN    NaN   1.0   1.0  1.0    1.0    1.0   1.0
4   NaN  NaN    NaN   NaN   1.0  1.0    1.0    1.0   1.0
5   NaN  NaN    NaN   NaN   NaN  1.0    1.0    1.0   1.0
6   NaN  NaN    NaN   NaN   NaN  NaN    1.0    1.0   1.0
7   NaN  NaN    NaN   NaN   NaN  NaN    NaN    1.0   1.0
8   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   1.0
9   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

2.7.2 满足多条件的行数据删除

# 多个条件:删除 one 列或 nine 列中值等于1.0的所有行
print(df.drop(df[(df['one']==1.0) | (df['nine']==1.0)].index))

执行结果如下:

    one  two  three  four  five  six  seven  eight  nine
9   NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
10  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN
11  NaN  NaN    NaN   NaN   NaN  NaN    NaN    NaN   NaN

三、删除重复数据

pandas.DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False)

  • subset: 默认值为None,表示检查所有列是否有重复的行。如果指定了这个参数,那么函数将仅检查指定的列是否有重复行。
  • keep:默认值为first,表示保留第一个值,删除其余的值。如果将其设置为last,则表示保留最后一个值,删除其余的值。
  • inplace:是否原地替换,默认不替换

创建DataFrame:

import pandas as pd
data = {'name': ['apple', 'orange', 'banana', 'banana', 'apple'],
       'price': [1.5, 2, 3, 3, 1.5],
       'weight': [1.5, 6, 8, 4, 1.5]}
df = pd.DataFrame(data)
print(df)

执行结果如下:

     name  price  weight
0   apple    1.5     1.5
1  orange    2.0     6.0
2  banana    3.0     8.0
3  banana    3.0     4.0
4   apple    1.5     1.5

3.1 删除所有列重复数据

# 默认删除所有列是否有重复数据
print(df.drop_duplicates())

执行结果如下:

     name  price  weight
0   apple    1.5     1.5
1  orange    2.0     6.0
2  banana    3.0     8.0
3  banana    3.0     4.0

3.2 指定列去除重复行

# 删除指定 name 列中有重复数据的行
print(df.drop_duplicates(subset=['name']))

执行结果如下:

     name  price  weight
0   apple    1.5     1.5
1  orange    2.0     6.0
2  banana    3.0     8.0

3.3 保留最后一个重复行

print(df.drop_duplicates(keep='last'))

执行结果如下:

     name  price  weight
1  orange    2.0     6.0
2  banana    3.0     8.0
3  banana    3.0     4.0
4   apple    1.5     1.5

从结果可以看出name为apple的数据为最后一行

索引重置

drop_duplicates 默认情况下是保留原始的row index,但是有时候我们需要根据0-N这种等差递增的index做其他操作时候,则需要重置index。

  • ignore_index=True:重置行index为 0, 1, …, n – 1.
  • ignore_index=False:则保留原始的行index, 这是默认操作
print(df.drop_duplicates(keep='last', ignore_index=True))

执行结果如下:

     name  price  weight
0  orange    2.0     6.0
1  banana    3.0     8.0
2  banana    3.0     4.0
3   apple    1.5     1.5

从执行结果来看,行索引从0开始,最后一行重复数据由原来行索引为4重置成3

3.4 原地删除

原地删除重复数据,只需要把drop_duplicates方法中参数inplace=True即可

  • 12
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值