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