一篇博客入门pandas模块

一篇blog入门pandas

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

Series

是一个一维的数组型对象,它包含了值序列和序列

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

Series之间进行加减

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())#都可以,嘿嘿嘿,贴心

<bound method NDFrame.head of     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
5  Nevada  2003  3.2>
    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
<class 'pandas.core.series.Series'>





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时,和空值进行运算的结果也会为空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章