pandas主要有三个用来删除的函数,.drop()、.drop_duplicates()、.dropna()。总结如下
- .drop()删除行、列
- .drop_duplicates()删除重复数据
- .dropna()删除空值(所在行、列)
为避免篇幅太长,将其分为两部分,不想看参数介绍的可以直接看实例。
本篇介绍.drop()
官方介绍:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html#pandas.DataFrame.drop
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')[source]
Drop specified labels from rows or columns.
Remove rows or columns by specifying label names and corresponding axis, or by specifying directly index or column names. When using a multi-index, labels on different levels can be removed by specifying the level.
Parameters:
labels : single label or list-like
Index or column labels to drop.
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
Whether to drop labels from the index (0 or ‘index’) or columns (1 or ‘columns’).
index, columns : single label or list-like
Alternative to specifying axis (labels, axis=1 is equivalent to columns=labels).
level : int or level name, optional
For MultiIndex, level from which the labels will be removed.
inplace : bool, default False
If True, do operation inplace and return None.
errors : {‘ignore’, ‘raise’}, default ‘raise’
If ‘ignore’, suppress error and only existing labels are dropped.
官方的介绍已经很详细了,这里做一个总结和实例的补充。
drop()功能:从行或列中删除指定的标签。
方法:通过指定标签名和对应的轴,或者直接指定索引名或列名,删除行或列。使用多索引时,可以通过指定级别删除不同级别的标签。
下面用人话解释一下:该函数可以删除指定的行或列,指定方式可以用数字索引也可以用自定义的索引。同时也可以删除多索引中不同级别的行或列(多索引后面会有例子,类似于word中的多级标题,drop可以删除指定级别标题下的某一行)
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=‘raise’)
- 参数介绍:
labels: 指定删除的行或列
axis: 0
表示行,1表示列。
Whether to drop labels from the index (0 or ‘index’) or columns (1 or ‘columns’).
index, columns:
选定所需要删除的行或列(可以是单独的行或列,也可以用数组表示多个行或列)
这两个参数与前两个有些重复
当使用整数标签(即0, 1, 2, …)指定labels时,axis=0则删除行;axis=1则删除列。
当使用自定义标签指定labels时,则直接删除指定的行或列。
level: 用于多级索引,删除指定等级的索引行或列,可以填索引等级或者直接填写索引名称。
inplace:
是否保留原数据。
True则表示不改变原数据,并将删除后的结果重新创建一个dataframe
False则直接改变原数据
-
代码实例
先创建一个df
import pandas as pd
df = pd.DataFrame({'age': [10, 11, 12],
'name': ['tim', 'TOm', 'rose'],
'income': [100, 200, 300]},
index = ['person1', 'person2', 'person3'])
print(df)
输出为:
age name income
person1 10 tim 100
person2 11 TOm 200
person3 12 rose 300
接下来开始删除
#删除行(axis默认0,可直接选定指定行)
df.drop('person1')
df.drop(['person1', 'person3'])
print(df)
#删除列(需要用columns或者axis=1)
df.drop('income', axis=1)#labels和axis组合
df.drop(columns=['age', 'income'])#columns参数
df.drop(df.columns[[0, 2]], axis=1)
print(df)
#inplace
#默认为False,删除指令不对原数据进行,可以将删除后的结果保存在新变量中
#当改为Ture,删除指令直接对原数据进行
df.drop('person1', inplace=True)
多索引
drop()也可以对多索引进行操作,level参数可以规定删除的索引等级。
level指定索引等级,等级与规定的行或列名称必须一致,否则虽然不会报错,但是不会进行任何操作。
我猜这是为了避免一级和二级索引之间有重名误删。
midx = pd.MultiIndex(levels=[['lama', 'cow', 'falcon'],
['speed', 'weight', 'length']],
codes=[[0, 0, 0, 1, 1, 1, 2, 2, 2],
[0, 1, 2, 0, 1, 2, 0, 1, 2]])
df1 = pd.DataFrame(index=midx, columns=['big', 'small'],
data=[[45, 30], [200, 100], [1.5, 1], [30, 20],
[250, 150], [1.5, 0.8], [320, 250],
[1, 0.8], [0.3,0.2]])
print(df1)
#删除行或列
df1.drop('cow')
df1.drop('big', axis=1)
df1.drop(index='cow', columns='big')
#level的用法
df1.drop('speed', level=1)#删除所有的'speed'行
Out[69]:
big small
lama weight 200.0 100.0
length 1.5 1.0
cow weight 250.0 150.0
length 1.5 0.8
falcon weight 1.0 0.8
length 0.3 0.2
df1.drop('speed', level=0)#等级不匹配,不会报错,但是没有进行任何操作。
Out[70]:
big small
lama speed 45.0 30.0
weight 200.0 100.0
length 1.5 1.0
cow speed 30.0 20.0
weight 250.0 150.0
length 1.5 0.8
falcon speed 320.0 250.0
weight 1.0 0.8
length 0.3 0.2