Python数据分析|pandas 实用方法(3)数据删除及数据
删除指定轴上的项
即删除 Series 的元素或 DataFrame 的某一行(列),通过对象的 .drop(labels, axis=0)方法。.drop() 返回的是一个新对象,原对象不会被改变。
原始数据
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
ser = Series(list('abcdefg'))
ser
Out[4]:
0 a
1 b
2 c
3 d
4 e
5 f
6 g
dtype: object
data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'], 'year':[2000,2001,2002,2001,2002], 'pop':[1.5,1.7,3.6,2.4,2.9]}
df = DataFrame(data)
df
Out[5]:
pop state year
0 1.5 Ohino 2000
1 1.7 Ohino 2001
2 3.6 Ohino 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
删除操作
ser.drop([1,3])
Out[9]:
0 a
2 c
4 e
5 f
6 g
dtype: object
df.drop([1,3])
Out[15]:
pop state year
0 1.5 Ohino 2000
2 3.6 Ohino 2002
4 2.9 Nevada 2002
df.drop('year',axis = 1)
Out[16]:
pop state
0 1.5 Ohino
1 1.7 Ohino
2 3.6 Ohino
3 2.4 Nevada
4 2.9 Nevada
pandas 支持通过 obj[::] 的方式进行索引和切片,以及通过布尔型数组进行过滤。
在这里还是要推荐下我自己建的Python开发学习群:304050799,群里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2018最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴
注意:因为 pandas 对象的 index 不限于整数,所以当使用非整数作为切片索引时,它是末端包含的,但是当使用整数作为切片索引时,它是不包含末端的。
Series的索引切片
ser[3]
Out[22]: 'd'
ser1 = Series(range(5),index = ['a','b','c','d','e'])
ser1
Out[19]:
a 0
b 1
c 2
d 3
e 4
dtype: int32
ser[:2]
Out[20]:
0 a
1 b
dtype: object
ser1[:'c']
Out[21]:
a 0
b 1
c 2
dtype: int32
从上面可以看出ser切片时不包含末端,但是ser1切片时包含末端。
DataFrame的索引切片
DataFrame 对象的索引方式有两个轴向(双重索引),DataFrame 对象的标准切片语法为:.ix[::,::]。ix 对象可以接受两套切片,分别为行(axis=0)和列(axis=1)的方向。
df.ix[:2,:3]
Out[23]:
pop state year
0 1.5 Ohino 2000
1 1.7 Ohino 2001
2 3.6 Ohino 2002
df.ix[:2,'state']
Out[24]:
0 Ohino
1 Ohino
2 Ohino
Name: state, dtype: object
如果不使用 ix ,直接切的情况就特殊了:
- 索引时,选取的是列
- 切片时,选取的是行
df['state']
Out[25]:
0 Ohino
1 Ohino
2 Ohino
3 Nevada
4 Nevada
Name: state, dtype: object
df[:3]
Out[26]:
pop state year
0 1.5 Ohino 2000
1 1.7 Ohino 2001
2 3.6 Ohino 2002
有一种特殊情况是:假如有 ser 这样的Series 索引是 index = [2,4,5],当我们使用 ser[2] 索引的时候,到底会被解释为第1个索引还是第3个索引,答案是第1个索引,即当你的数组 index 是整数类型的时候,你使用整数索引,都会被自动解释为基于标签的索引,而不是基于位置的索引。要想消除这种歧义,推荐使用一下两种索引方式:
.loc[label] 这是严格基于标签的索引(包含边界元素)
.iloc[inte] 这是严格基于整数位置的索引(不包含边界元素)
.ix[] 更像是这两种严格方式的智能整合版。
df1 = DataFrame(data,index = [1,3,5,7,9])
df1
Out[20]:
pop state year
1 1.5 Ohino 2000
3 1.7 Ohino 2001
5 3.6 Ohino 2002
7 2.4 Nevada 2001
9 2.9 Nevada 2002
df1.loc[:3]
Out[21]:
pop state year
1 1.5 Ohino 2000
3 1.7 Ohino 2001
df1.iloc[:3]
Out[22]:
pop state year
1 1.5 Ohino 2000
3 1.7 Ohino 2001
5 3.6 Ohino 2002
切片时使用布尔型数组
df['year'] ==2002
Out[37]:
0 False
1 False
2 True
3 False
4 True
Name: year, dtype: bool
df[df['year'] ==2002]
Out[38]:
pop state year
2 3.6 Ohino 2002
4 2.9 Nevada 2002
选出满足列条件的行。
df.ix[2] == 2002
Out[49]:
pop False
state False
year True
Name: 2, dtype: bool
df.ix[:3,df.ix[2]==2002]
Out[50]:
year
0 2000
1 2001
2 2002
3 2001
选出满足行条件的列。