一篇博客入門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時,和空值進行運算的結果也會爲空

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