Pandas入門學習(3)
文章目錄
Pandas 常用功能
主要介紹
Pandas
的常用功能
1、Pandas 迭代
Padndas
物件之間基本迭代行為取決於型別。
當迭代Series
時,被視為陣列。
當迭代DataFrame
,遵循迭代物件的鍵。
- Series:值
- DataFrame:列標籤
迭代 DataFrame
迭代
DataFrame
提供列名。
import pandas as pd import numpy as np N = 10 df = pd.DataFrame({ 'A': pd.date_range('2016-11-11',periods=N), 'C': np.linspace(0,num=N,stop=N-1), 'X': np.random.rand(N), 'W': np.random.choice(['Low','Mid','High'],N).tolist(), 'D': np.random.normal(100,10,size=(N)).tolist(), }) for item in df: print(item)
A
C
X
W
D
注意: 要遍歷 DataFrame
中的行,使用下面函式。
- iteritems():迭代
(key, value)
對 - iterrows():將行迭代為(索引,Series)對
- itertuples():以
nametuple
的形式迭代行
iteritems()示例
將每個列作為鍵,將值與值作為鍵和列值迭代為
Series
物件
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3,3), columns=['A','B','C'])
for key, value in df.iteritems():
print(key)
print(value)
A
0 0.957009
1 0.501260
2 0.274135
Name: A, dtype: float64
B
0 0.078463
1 0.987697
2 0.781049
Name: B, dtype: float64
C
0 0.733517
1 0.803489
2 0.074316
Name: C, dtype: float64
iterrows()示例
ierrows()
返回迭代器,產生每個索引值以及包含沒行資料的序列
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3,3), columns=['A','B','C'])
for key, value in df.iterrows():
print(key)
print(value)
0
A 0.656146
B 0.214489
C 0.112665
Name: 0, dtype: float64
1
A 0.529889
B 0.261862
C 0.747018
Name: 1, dtype: float64
2
A 0.415430
B 0.525688
C 0.015409
Name: 2, dtype: float64
itertuples()示例
itertuples()
將為DataFrame
中每一行返回一個tuplename
元組。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(3,3), columns=['A','B','C'])
for row in df.itertuples():
print(row)
Pandas(Index=0, A=0.02256113604091181, B=0.4702768374802535, C=0.0965308087405059)
Pandas(Index=1, A=0.8422016872537603, B=0.17994358605628646, C=0.042277440820879364)
Pandas(Index=2, A=0.7924808877865748, B=0.7236640663801537, C=0.5110374703536472)
2、Pandas 排序
Pandas 有兩種排序方式
- 按標籤
- 按實際值
按標籤排序
sort_index()
:方法預設ascending
引數True
升序。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(4,3), index=[1,9,4,5], columns=['A','B','C'])
print(df)
df_sorted = df.sort_index(ascending=False)
print(df_sorted)
A B C
1 0.132607 0.105872 0.875598
9 0.223384 0.362026 0.437898
4 0.638698 0.277726 0.453978
5 0.115070 0.709539 0.835981
A B C
9 0.223384 0.362026 0.437898
5 0.115070 0.709539 0.835981
4 0.638698 0.277726 0.453978
1 0.132607 0.105872 0.875598
按列排序
通過傳遞引數
axis
引數值為0
或1
,對標籤進行排序。
預設情況下,axis=0
,按行排列。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(4,3), index=[1,9,4,5], columns=['A','C','B'])
print(df)
df_sorted = df.sort_index(axis=1)
print(df_sorted)
A C B
1 0.988267 0.908142 0.680500
9 0.675936 0.308623 0.249646
4 0.626666 0.162618 0.735269
5 0.490554 0.177270 0.603323
A B C
1 0.988267 0.680500 0.908142
9 0.675936 0.249646 0.308623
4 0.626666 0.735269 0.162618
5 0.490554 0.603323 0.177270
按值排序
像索引排序一樣,
sort_values()
是按值排序的方法。
接受by
引數,將使用要與其排序值的DataFrame
的列名稱。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(4,3), index=[1,9,4,5], columns=['A','C','B'])
df_sorted1 = df.sort_values(by=['C','B'])
df_sorted2 = df.sort_values(by='C')
print(df_sorted1)
print(df_sorted2)
A C B
9 0.902778 0.189340 0.435696
4 0.169302 0.245135 0.647082
5 0.491392 0.372607 0.386437
1 0.294235 0.904643 0.018072
A C B
9 0.902778 0.189340 0.435696
4 0.169302 0.245135 0.647082
5 0.491392 0.372607 0.386437
1 0.294235 0.904643 0.018072
3、Pandas索引和選擇資料
索引運算子
[]
和屬性運算子.
,可以快速訪問Pandas
資料結構。
現在支援三種類型的多軸索引
方法索引
索引 | 描述 |
---|---|
.loc() | 基於標籤 |
.iloc() | 基於整數 |
.ix() | 基於標籤和整數 |
注意: 裡面的引數,第一個是行,第二個是列。
loc()
loc() 有多種訪問方式:
- 單個標量標籤
- 標籤列表
- 切片物件
- 一個布林陣列
loc
需要兩個單/列表/範圍運算子,用,
分割。第一個表示行,第二個表示列。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3), index=['a','b','c','d','e'], columns=['A','B','C'])
print(df.loc[:,'A'])
print(df.loc[:,['A','C']])
print(df.loc[['a','c','e'],['A','C']])
print(df.loc['a':'c','A':'B'])
a 0.535062
b 0.037609
c 0.190991
d 0.875407
e 0.234947
Name: A, dtype: float64
A C
a 0.535062 0.402936
b 0.037609 0.036611
c 0.190991 0.749456
d 0.875407 0.676398
e 0.234947 0.385565
A C
a 0.535062 0.402936
c 0.190991 0.749456
e 0.234947 0.385565
A B
a 0.535062 0.004707
b 0.037609 0.473187
c 0.190991 0.947285
iloc()
純整數索引
- 整數
- 整數列表
- 系列值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3), index=['a','b','c','d','e'], columns=['A','B','C'])
print(df.iloc[:3,:2])
print(df.iloc[:2,[0,2]])
A B
a 0.558476 0.962624
b 0.238883 0.116831
c 0.881508 0.411235
A C
a 0.558476 0.717169
b 0.238883 0.830214
ix()
進行選擇和子集化物件的混合方法。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3), index=['a','b','c','d','e'], columns=['A','B','C'])
print(df.ix[:4])
print(df.loc[:,'A'])
A B C
a 0.031052 0.325817 0.118600
b 0.280782 0.990863 0.873839
c 0.488767 0.051455 0.073738
d 0.161729 0.546026 0.542651
a 0.031052
b 0.280782
c 0.488767
d 0.161729
e 0.409365
Name: A, dtype: float64
運算子索引
使用符號來對資料進行索引
物件 | 索引 | 描述 |
---|---|---|
Series | s.loc[] | 標量值 |
DataFrame | df.loc[] | 標量物件 |
符號訪問
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3), index=['a','b','c','d','e'], columns=['A','B','C'])
print(df['A'])
print(df[['A','B']])
print(df[2:3])
a 0.410222
b 0.082454
c 0.862867
d 0.010191
e 0.110962
Name: A, dtype: float64
A B
a 0.410222 0.402827
b 0.082454 0.508531
c 0.862867 0.747506
d 0.010191 0.357649
e 0.110962 0.118784
A B C
c 0.862867 0.747506 0.292915
屬性訪問
使用屬性運算子
.
選擇列
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3), index=['a','b','c','d','e'], columns=['A','B','C'])
print(df.A)
a 0.203211
b 0.946038
c 0.467963
d 0.949120
e 0.528867
Name: A, dtype: float64
4、Pandas 統計函式
百分比(pct_change())
Series、DataFrame都有
pct_change()
函式
此函式將每個元素與前一個元素進行比較,並計算變化百分比
import pandas as pd
import numpy as np
s = pd.Series(np.arange(1,6))
print(s.pct_change())
df = pd.DataFrame(np.random.rand(5,2))
print(df.pct_change())
0 NaN
1 1.000000
2 0.500000
3 0.333333
4 0.250000
dtype: float64
0 1
0 NaN NaN
1 -0.014001 -0.912531
2 0.268638 8.857442
3 -0.527441 0.511108
4 0.280720 -0.566934
相關性(corr())
相關性顯示任何兩個數值(Series)之間的線性關係
Dataframe中存在非數字的列,則自動排除
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,2))
print(df[0].corr(df[1]))
print(df.corr())
0.6188159891824275
0 1
0 1.000000 0.618816
1 0.618816 1.000000
資料排名(rank())
為元素陣列中的每個元素生成排名
import pandas as pd
import numpy as np
s = pd.Series([1,6,3,2])
print(s.rank())
0 1.0
1 4.0
2 3.0
3 2.0
dtype: float64
5、缺失資料處理
Padndas 的缺失值(NA 或NaN)
資料缺失
使用重構索引,建立一個缺失的
DataFrame
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df)
one two three
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d NaN NaN NaN
檢查缺失值
為了檢查缺失值,
Pandas
提供了isnull()
和notnull()
函式
也是Series
和DataFrame
物件的方法
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df['one'].isnull())
print(df['one'].notnull())
a False
b True
c False
d True
Name: one, dtype: bool
a True
b False
c True
d False
Name: one, dtype: bool
缺少資料的計算
在求和資料時,
NA
被視為0
資料全是NA
,結果就是NA
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df['one'].sum())
3.0
清洗/填充缺少資料
fillna()
函式通過集中方法用非空資料填充NA
值
用標量值替換NaN
使用
0
來替換NaN
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df)
print(df.fillna(0))
one two three
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d NaN NaN NaN
one two three
a 0.0 1.0 2.0
b 0.0 0.0 0.0
c 3.0 4.0 5.0
d 0.0 0.0 0.0
填寫NaN的前面/後面值
將空缺的
NaN
的值,填寫為前面值或後面值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df)
print(df.fillna(method='pad')) # 前面值
print(df.fillna(method='bfill')) # 後面值
one two three
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d NaN NaN NaN
one two three
a 0.0 1.0 2.0
b 0.0 1.0 2.0
c 3.0 4.0 5.0
d 3.0 4.0 5.0
one two three
a 0.0 1.0 2.0
b 3.0 4.0 5.0
c 3.0 4.0 5.0
d NaN NaN NaN
丟失缺少的值
排除缺少的值,使用
dropna
函式和axis
引數。
預設情況下,axis=0
,也就是行記憶體在NA
,整行刪除
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(12.).reshape(4,3),
index = list('acef'),
columns = ['one', 'two', 'three'])
df = df.reindex(list('abcd'))
print(df.dropna())
print(df.dropna(axis=1))
one two three
a 0.0 1.0 2.0
c 3.0 4.0 5.0
Empty DataFrame
Columns: []
Index: [a, b, c, d]
替換丟失/通用值
用標量替換
NA
是fillna()
函式的等效行為
import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000],
'two':[1000,0,30,40,50,60]})
print(df.replace({1000:10,2000:60}))
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60