pandas之于python就犹如屠龙刀之于江湖,没有pandas的python之路注定是艰难的,而pandas的知识点兼具复杂和多样
这篇文章将带领我们入门pandas,让我们学会基础的数据处理。
话不多说,上代码
import pandas as pd
import numpy as np
obj = pd.Series([4,7,-5,3])
obj
out:
0 4
1 7
2 -5
3 3
dtype: int64
就像numpy的array()方法一样,pandas也有自己常用的数据结构
Series and DataFrame
是一个一维的数组型对象,它包含了值序列和序列
print(obj.values)
obj.index
[ 4 7 -5 3]
RangeIndex(start=0, stop=4, step=1)
#自定义索引
obj2 = pd.Series([4,7,-5,3],index = ['d','b','a','c'])
obj2
d 4
b 7
a -5
c 3
dtype: int64
obj3 = pd.Series(pd.Series([4,7,-5,3,1],index = ['d','b','a','c','e']))
print(obj3+obj2)
a -10.0
b 14.0
c 6.0
d 8.0
e NaN
dtype: float64
这时候应该注意到obj2的index中没有’e’,最后相加得到的Series中索引’e’为空
得:
在Series的加减中,如果一方索引为空,那么相加的索引也必为空
So
甲方:不能为空!我要想为什么为什么
print(obj3.add(obj2,fill_value = 0))#0可以用任意数字代替
a -10.0
b 14.0
c 6.0
d 8.0
e 1.0
dtype: float64
DataFrame表示的是矩阵的数据表。既有行索引也有列索引,在DataFrame中,数据被存储在一个二维块中
构建DataFrame
data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,2.4,2.9,3.2]}
frame = pd.DataFrame(data)
#查看frame的top5行
print(frame.head)
print(frame.head())#都可以,嘿嘿嘿,贴心
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
Dataframe的一些基本操作
#更改列的顺序
pd.DataFrame(data,columns=['year','state','pop'])
year | state | pop | |
---|---|---|---|
0 | 2000 | Ohio | 1.5 |
1 | 2001 | Ohio | 1.7 |
2 | 2002 | Ohio | 3.6 |
3 | 2001 | Nevada | 2.4 |
4 | 2002 | Nevada | 2.9 |
5 | 2003 | Nevada | 3.2 |
#更改Dataframe中的部分值
frame[3:]['pop'] = 1.1
frame.iloc[4:]['pop'] = 2.2
frame.loc[5:]['pop'] = 3.3
#上述三种情况都可以运行,但是采取下面的这种方法才比较正规
frame.loc[0,'pop'] = 4.4
print(frame)
state year pop
0 Ohio 2000 4.4
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 1.1
4 Nevada 2002 2.2
5 Nevada 2003 3.3
那么通过loc和iloc选择数据时有什么不同么?
loc 允许使用轴标签
iloc 允许使用整数标签
data_loc = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['a','b','c','d'],columns=['A','B','C','D'])
print(data_loc.loc[:'b',:'B'])
print(data_loc.iloc[2:,:2])
A B
a 0 1
b 4 5
A B
c 8 9
d 12 13
当你想在frame中再添加一列
print(frame)
val = pd.Series(range(6),index=range(6))
frame['num'] = val
print(frame)
state year pop
0 Ohio 2000 4.4
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 1.1
4 Nevada 2002 2.2
5 Nevada 2003 3.3
state year pop num
0 Ohio 2000 4.4 0
1 Ohio 2001 1.7 1
2 Ohio 2002 3.6 2
3 Nevada 2001 1.1 3
4 Nevada 2002 2.2 4
5 Nevada 2003 3.3 5
添加完一行,添加一列
data = {'state':['zzy','zzy','zzy'],
'year':[2000,2001,2002],
'pop':[1.5,1.7,3.6],
'num':[6,7,8]}
frame2 = pd.DataFrame(data)
frame3 = frame.append(frame2)#!!!!!!!!Attention这里不能进行简单的加减
print(frame)
print('*****************************************************华丽的分隔符*******************')
print(frame2)
print('*****************************************************华丽的分隔符*******************')
print(frame3)
state year pop num
0 Ohio 2000 4.4 0
1 Ohio 2001 1.7 1
2 Ohio 2002 3.6 2
3 Nevada 2001 1.1 3
4 Nevada 2002 2.2 4
5 Nevada 2003 3.3 5
*****************************************************华丽的分隔符*******************
state year pop num
0 zzy 2000 1.5 6
1 zzy 2001 1.7 7
2 zzy 2002 3.6 8
*****************************************************华丽的分隔符*******************
state year pop num
0 Ohio 2000 4.4 0
1 Ohio 2001 1.7 1
2 Ohio 2002 3.6 2
3 Nevada 2001 1.1 3
4 Nevada 2002 2.2 4
5 Nevada 2003 3.3 5
0 zzy 2000 1.5 6
1 zzy 2001 1.7 7
2 zzy 2002 3.6 8
所以当你想要在你的Dataframe中再添加一列的时候,不要忘了给你的数据赋index
添加之后,就应该删除了 del
del frame['pop']
frame
state | year | num | |
---|---|---|---|
0 | Ohio | 2000 | 0 |
1 | Ohio | 2001 | 1 |
2 | Ohio | 2002 | 2 |
3 | Nevada | 2001 | 3 |
4 | Nevada | 2002 | 4 |
5 | Nevada | 2003 | 5 |
列删除完了,删除行
new_frame = frame.drop([4,5])
print(new_frame)
print('*****************************************************华丽的分隔符*******************')
new_frame = new_frame.drop(['num'],axis = 1)
print(new_frame)
state year num
0 Ohio 2000 0
1 Ohio 2001 1
2 Ohio 2002 2
3 Nevada 2001 3
*****************************************************华丽的分隔符*******************
state year
0 Ohio 2000
1 Ohio 2001
2 Ohio 2002
3 Nevada 2001
转置
frame.T
0 | 1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
state | Ohio | Ohio | Ohio | Nevada | Nevada | Nevada |
year | 2000 | 2001 | 2002 | 2001 | 2002 | 2003 |
num | 0 | 1 | 2 | 3 | 4 | 5 |
frame.values
array([['Ohio', 2000, 0],
['Ohio', 2001, 1],
['Ohio', 2002, 2],
['Nevada', 2001, 3],
['Nevada', 2002, 4],
['Nevada', 2003, 5]], dtype=object)
frame.index
RangeIndex(start=0, stop=6, step=1)
在进行数据处理的时候不免会用到,更改索引的情况
重建索引
obj = pd.Series([2,3,4,5,6],index=['a','b','c','d','e'])
print(obj)
obj2 = obj.reindex(['e','d','c','b','a','f'])
obj2
a 2
b 3
c 4
d 5
e 6
dtype: int64
e 6.0
d 5.0
c 4.0
b 3.0
a 2.0
f NaN
dtype: float64
如果某个索引值之前不存在,则会引入缺失值NAN
那么必然就有新的需求了,产品要求我们不能引入缺失值
obj3 = pd.Series(['a','b','c'],index = range(0,6,2))
print(obj3)
obj4 = obj3.reindex(range(6),method = 'bfill')#向后填充
obj5 = obj3.reindex(range(6),method = 'ffill')#向前填充
print(obj4)
print(obj5)
0 a
2 b
4 c
dtype: object
0 a
1 b
2 b
3 c
4 c
5 NaN
dtype: object
0 a
1 a
2 b
3 b
4 c
5 c
dtype: object
切片
普通切片是不包含尾部的,但是Series切片包含尾部!!!!!!!!!!
print(obj)
print(type(obj))
obj['a':'e']
a 2
b 3
c 4
d 5
e 6
dtype: int64
a 2
b 3
c 4
d 5
e 6
dtype: int64
Dataframe常用的就是针对某一行 or 某一列进行操作
data_loc
A | B | C | D | |
---|---|---|---|---|
a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 |
c | 8 | 9 | 10 | 11 |
d | 12 | 13 | 14 | 15 |
f = lambda x:x.max() - x.min()
print(data_loc.apply(f))
#针对行进行操作
print('*****************************************************华丽的分隔符*******************')
print(data_loc.apply(f,axis = 1))
A 12
B 12
C 12
D 12
dtype: int64
*****************************************************华丽的分隔符*******************
a 3
b 3
c 3
d 3
dtype: int64
传一个有时候不能满足实际需求,传多个试试
def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
print(data_loc.apply(f))
A B C D
min 0 1 2 3
max 12 13 14 15
在实际应用中,更多的时候需要对Dataframe中的元素进行操作
format_ = lambda x:'%.2f' % x
print(data_loc.applymap(format_))
A B C D
a 0.00 1.00 2.00 3.00
b 4.00 5.00 6.00 7.00
c 8.00 9.00 10.00 11.00
d 12.00 13.00 14.00 15.00
排序环节
data_loc.sort_values(by = ['A'],axis=0,ascending=False)#A为排序键,可以设置多列;0代表行列排序;False代表降序排列
A | B | C | D | |
---|---|---|---|---|
d | 12 | 13 | 14 | 15 |
c | 8 | 9 | 10 | 11 |
b | 4 | 5 | 6 | 7 |
a | 0 | 1 | 2 | 3 |
data_loc.sort_index(axis=0,ascending=False) #按照索引降序排列
A | B | C | D | |
---|---|---|---|---|
d | 12 | 13 | 14 | 15 |
c | 8 | 9 | 10 | 11 |
b | 4 | 5 | 6 | 7 |
a | 0 | 1 | 2 | 3 |
概率论相关操作
data_loc.sum()#min() mean() argmin()最小值的索引位置。
A | B | C | D | |
---|---|---|---|---|
a | 0 | 1 | 2 | 3 |
b | 4 | 5 | 6 | 7 |
c | 8 | 9 | 10 | 11 |
d | 12 | 13 | 14 | 15 |
Q:当遇见空值怎么办呢?
A:默认空值会被当作0,当参数skipna = False时,和空值进行运算的结果也会为空