本文是对pandas基本功能的一个回顾性总结记录,本文将围绕下属目录展开,并附上了自己的代码注释。
目录
索引对象
特点
索引对象并不可直接修改,但是可以通过如set_index和reset_index等方法进行 变换
index的方法和属性
相关函数
reindex
含义 :
Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值;DataFrame的reindex生成新的(行)索引和列的dataframe。
参数(了解即可)
例子
obj3=Series(['blue','purple','yellow'],index=[0,2,4])
print(obj3.reindex(range(6),method='ffill')) # method 方法给值'ffill'和'pad',均为使用向前填充 ,对于时间序列数据常用此方法,对应的向后填充为bfill(或者backfill)
print("\n")
print(obj3) # obj3并没有边,即索引并不可修改。reindex只是新建了一个对象而已
print(obj3.reindex(range(6),method='pad'))
输出
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
0 blue
2 purple
4 yellow
dtype: object
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object
实例2
#reindex
frame= DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['Ohio','Texas','California'])
print(frame)
frame2 = frame.reindex(['a', 'b', 'c', 'd']) # 这是产生了一个新的DataFrame
print(frame2)
print(frame) # frame的索引仍然为原值acd,
输出 # 注意frame的索引仍然为原值acd
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
drop
含义
丢弃某条轴上的一个或多个项很简单,只要重新赋值不取这个索引数组或列表即可。但也通过drop的方式去做,由于需要执行一些数据整理和集合逻辑,drop方法默认返回的是一个在指定轴上删除了指定值的新对象。注意原来的并没有变。如果要改变原来的,则参数inplace=True。
参数
第一个参数为行的索引或者要删除列的list。
axis=0 ,表示行变,从行标签删除要删除的行索引的各行数据
axis=1,表示列变,删除列的值
inplace=False ,默认不替换,即不会改变原对象,如果置为True,则会替换改变掉原来的对象
例子
data = DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
print(data.drop(['Colorado','Ohio']))
输出
one two three four
Utah 8 9 10 11
New York 12 13 14 15
选取和过滤数据
切片索引
注意: 利用标签的切片运算与普通的Python整数切片运算不同,其末端是包含的:
例子
obj22=Series(np.arange(4),index=['d','b','a','c'])
print(obj22['b':'c']) #此处的str 索引切片也是从前往后去,注意 包括了右侧的c的 值!!! 而整型值是左闭右开
print(obj22[0:2]) # 左闭右开 ,并没有包含2对应的a 的值
输出
b 1
a 2
c 3
dtype: int64
d 0
b 1
dtype: int64
普通选取和过滤数据
选取指定列的各行数据, 例子
print(data[['three','one']] )# 也可以直接写列,前面并不用加东西,等同与前面ix和loc,前面加行。选取three,one这两列所有行的数据
print(data.ix[:,['three','one']])# 同上选取three,one这两列所有行的数据
print(data.loc[:,['three','one']]) # 同上选取three,one这两列所有行的数据
选取某列中符合某个条件的所有各行数据,例子
print(data[data['three']>5])# 选取的数据中,three这列的值要大于5
print(data.ix[data.three>5,:4]) # 选取第三列的数据中值大于5的数据,且只取前2个列
输出
one two three four
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
one two
Colorado 4 5
Utah 8 9
New York 12 13
算术运算和数据对齐
pandas重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。对于有数据库经验的用户,这就像在索引标签上进行自动外连接。 对于不同索引对,可以指定填充值
#使用df1的add方法,传入df2以及一个fill_value参数:
df1.add(df2, fill_value=0)
函数应用和映射 apply等
NumPy的ufuncs(元素级数组方法)也可用于操作pandas对象,例子
如np.abs(frame)# 返回一个对frame的各个数据都取绝对值
apply方法
含义:将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能:
例子
f = lambda x : x.max()-x.min()
frame.apply(f) # 默认是axis=0,行数会变,按行操作,列数不会变,返回得到的是一个新的series
print(frame)
输出
b 1.802165
d 1.684034
e 2.689627
dtype: float64
b d e
Utah -0.204708 0.478943 -0.519439
Ohio -0.555730 1.965781 1.393406
Texas 0.092908 0.281746 0.769023
Oregon 1.246435 1.007189 -1.296221
def f(x):
return Series([x.min() ,x.max()],index=['min','max']) # 注意也可以是多个结果的封装
print(frame.apply(f)) # 行或者列级的函数用apply
输出
b d e
min -0.555730 0.281746 -1.296221
max 1.246435 1.965781 1.393406
applymap方法
含义:对于dataframe中将函数应用到元素级别
例子
format=lambda x : '%.2f'%x # 整个保留2为小数
frame.applymap(format) #元素级的函数用applymap ,即对每个元素都处理
map方法
含义
对于Series将函数 应用到元素级别
排序和排名
sort_index
根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象。默认是axis=0,对行索引排序。可以指定按某列排序
例子
frame=DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
print(frame.sort_index() )# sort_index的顺序默认是字典序, 默认是对行,即行变,各列的相对顺序不会变
print(frame.sort_index(1)) # 对列
print(frame.sort_index(axis=1)) # 对列
输出
d a b c
one 4 5 6 7
three 0 1 2 3
a b c d
three 1 2 3 0
one 5 6 7 4
a b c d
three 1 2 3 0
one 5 6 7 4
按某列排序例子
print(frame.sort_ values(by='d',ascending=False))# 按d列的降序排序
输出
d a b c
one 4 5 6 7
three 0 1 2 3
series.rank
根据某个series中值的打下进行给排序的名次
例子
obj=Series([7,-5,7,4,2,0,4])
print(obj.rank(method='first') )# Series的rank和numpy.argsort产生的间接排序索引 (注意是索引) 差不多,只不过他可以根据某种规则破坏平级关系,另外返回的是排序的序号(从1开始,而numpy.argsort返回的是索引(值从0开始))。如给值first 时,表示对于出现同样大小的值时按值在原始数据中的出现顺序分配排名。给值max ,使用整个分组的最大排名。
print(obj.rank(method='max'))
输出
0 6.0
1 1.0
2 7.0
3 4.0
4 3.0
5 2.0
6 5.0
dtype: float64
0 7.0
1 1.0
2 7.0
3 5.0
4 3.0
5 2.0
6 5.0
dtype: float64
参考与鸣谢:
《利用python进行数据分析》