一、DataFrame簡介
DataFrame是一個帶有索引的二維數據結構,每列可以有自己的名字,並且可以有不同的數據類型。你可以把它想象成一個excel表格或者數據庫中的一張表,DataFrame是最常用的Pandas對象。如下圖所示:
Pandas中的DataFrame可以使用下列函數構建:
import pandas as pd
pd. DataFrame( data= None , index: Union[ Collection, NoneType] = None , \
columns: Union[ Collection, NoneType] = None , \
dtype: Union[ str , numpy. dtype, _ForwardRef( 'ExtensionDtype' ) , \
NoneType] = None , copy: bool = False )
參數
說明
是否必要
data
ndarray(結構化或同類),可迭代,dict或DataFrame、Dict可以包含Series,數組,常量或類似列表的對象
必要
index
設置行標籤,如果未提供列標籤,則爲(0,1,2,…,n),長度必須與行長度一致
非必要
columns
設置列標籤,如果未提供列標籤,則爲(0,1,2,…,n),長度必須與列長度一致
非必要
dtype
每列的數據類型,如果沒有,則推斷
非必要
copy
默認爲False,從輸入中複製數據。
非必要
二、創建DataFrame
2.1 創建空DataFrame
import pandas as pd
pd. DataFrame( )
2.2 列表創建DataFrame
import pandas as pd
lst = [ 1 , 2 , 3 ]
pd. Series( lst)
0 1
1 2
2 3
dtype: int64
import pandas as pd
lst = [ 1 , 2 , 3 ]
pd. DataFrame( lst)
import pandas as pd
lst = [ [ 1 , 2 , 3 ] , [ 2 , 3 , 4 ] ]
pd. DataFrame( lst)
lst = [ [ 1 , 2 , 3 ] , [ 2 , 3 , 4 , 5 ] ]
pd. DataFrame( lst)
0
1
2
3
0
1
2
3
NaN
1
2
3
4
5.0
2.3 字典創建DataFrame
import pandas as pd
dic = { "a" : 1 , "b" : 2 }
import pandas as pd
data = { 'Name' : [ '小明' , '小豬' , '蘑菇頭' , '毛臺' ] , 'Age' : [ 18 , 34 , 29 , 22 ] }
pd. DataFrame( data)
Name
Age
0
小明
18
1
小豬
34
2
蘑菇頭
29
3
毛臺
22
import pandas as pd
data = { 'Name' : ( '小明' , '小豬' , '蘑菇頭' , '毛臺' ) , 'Age' : [ 18 , 34 , 29 , 22 ] }
pd. DataFrame( data)
Name
Age
0
小明
18
1
小豬
34
2
蘑菇頭
29
3
毛臺
22
Series字典創建DataFrame
import pandas as pd
d = { 'one' : pd. Series( [ 1 , 2 , 3 ] , index= [ 'a' , 'b' , 'c' ] ) ,
'two' : pd. Series( [ 1 , 2 , 3 , 4 ] , index= [ 'a' , 'b' , 'c' , 'd' ] ) }
pd. DataFrame( d)
one
two
a
1.0
1
b
2.0
2
c
3.0
3
d
NaN
4
2.4 二維數組創建DataFrame
這裏僅僅只有二維數組(矩陣)能夠創建出DataFrame,其餘都不可。【NumPy數組學習參考】
import numpy as np
import pandas as pd
x = np. arange( 15 ) . reshape( 5 , 3 )
pd. DataFrame( x, index= [ "a" , "b" , "c" , "d" , "e" ] , columns= [ "A" , "B" , "C" ] )
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
三、DataFrame的增刪改查
本節引例
import numpy as np
import pandas as pd
x = np. arange( 15 ) . reshape( 5 , 3 )
df = pd. DataFrame( x, index= [ "a" , "b" , "c" , "d" , "e" ] , columns= [ "A" , "B" , "C" ] )
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
3.1 DataFrame的增
3.1.1 行增加
利用append方法將它們拼接起來,注意參數中的ignore_index=True,如果不把這個參數設爲True,新排的數據塊索引不會重新排列。
df111 = df. copy( )
a = df111[ : 2 ]
b = df111[ 2 : ]
a. append( b, ignore_index= True )
A
B
C
0
0
1
2
1
3
4
5
2
6
7
8
3
9
10
11
4
12
13
14
用.concat()的方法來進行拼接,與append類似
pd. concat( [ a, b] , ignore_index= True )
A
B
C
0
0
1
2
1
3
4
5
2
6
7
8
3
9
10
11
4
12
13
14
loc法
df112 = df. copy( )
df112. loc[ "f" ] = list ( range ( 3 ) )
df112. loc[ "g" ] = 3
df112
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
f
0
1
2
g
3
3
3
若需指定行位置添加,可以通過DataFrame.T先將其行列互換,添加後再次轉置回來即可。
3.1.2 列增加
新增空白列,注意空白不是缺失值,NaN纔是缺失值
df121 = df. copy( )
df121[ "C" ] = ""
df121
A
B
C
a
0
1
b
3
4
c
6
7
d
9
10
e
12
13
只能在末尾新增,同時可創建列索引
df122 = df. copy( )
df122[ "D" ] = 3
df122[ "E" ] = list ( range ( len ( df4) ) )
df122
A
B
C
D
E
a
0
1
2
3
0
b
3
4
5
3
1
c
6
7
8
3
2
d
9
10
11
3
3
e
12
13
14
3
4
如果需要在指定的位置添加新的一列,用insert( )函數
df. insert( loc, column, value, allow_duplicates= False )
參數
說明
loc
插入索引(int型)。 0 <= loc <= len(columns)
column
str,數字或可哈希對象,插入列的標籤。
value
int,Series或類似數組的值
allow_duplicates
布爾值,可選
df123 = df. copy( ) . T
df123. insert( 2 , "D" , "" )
df123. T
A
B
C
a
0
1
2
b
3
4
5
D
c
6
7
8
d
9
10
11
e
12
13
14
3.2 DataFrame的刪
DataFrame. drop( labels= None , axis= 0 , index= None , columns= None , inplace= False )
參數
說明
labels
就是要刪除的行列的名字,用列表給定
axis
默認爲0,指刪除行,因此刪除columns時要指定axis=1
index
直接指定要刪除的行
columns
直接指定要刪除的列
inplace=False
默認該刪除操作不改變原數據,而是返回一個執行刪除操作後的dataframe
inplace=True
則會直接在原數據上進行刪除操作,刪除後無法返回
df. pop( item)
3.2.1 行刪除
根據行索引,指定位置刪除行
df211 = df. copy( )
df211. drop( "a" , axis= 0 , inplace= True )
df211
A
B
C
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
df211. drop( [ "b" , "c" ] )
A
B
C
d
9
10
11
e
12
13
14
3.2.2 列刪除
根據列索引,指定位置刪除列
df221 = df. copy( )
df221. drop( "A" , axis= 1 , inplace= True )
df221
B
C
a
1
2
b
4
5
c
7
8
d
10
11
e
13
14
pop法
df222 = df. copy( )
df222. pop( "A" )
df222
B
C
a
1
2
b
4
5
c
7
8
d
10
11
e
13
14
del法
del df222[ "B" ]
df222
3.3 DataFrame的改
3.3.1 根據索引更改行
df31 = df. copy( )
df31. loc[ "a" ] = ""
df31
A
B
C
a
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
3.3.2 根據索引更改列
df32 = df. copy( )
df32[ "A" ] = ""
df32
A
B
C
a
1
2
b
4
5
c
7
8
d
10
11
e
13
14
3.3.3 通過行列索引更改指定位置元素
df33 = df. copy( )
df33. loc[ "a" ] [ "A" ] = 2
df33. iloc[ 0 , 2 ] = "a"
df33
A
B
C
a
2
1
a
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
3.4 DataFrame的查
3.4.1 查看行
獲取某一行,或者多行行
df41 = df. copy( )
df41[ 2 : 3 ]
df41[ : 3 ]
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
獲取某行或某幾行
df41. loc[ "a" ]
A 0
B 1
C 2
Name: a, dtype: int32
df41. loc[ "a" : "c" ]
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
df41. iloc[ 1 : 2 , : ]
獲取指定位置元素
df41. loc[ "a" ] [ "A" ]
0
df41. iloc[ 0 , 2 ]
2
df41. at[ "a" , "B" ]
1
df41. iat[ 1 , 2 ]
5
獲取指定位置多個元素
df41. iloc[ 0 : 3 , 1 : 3 ]
查看前n行
df41. head( 2 )
查看後n行
df41. tail( 2 )
A
B
C
d
9
10
11
e
12
13
14
3.4.2 查看列
df42 = df. copy( )
df42[ [ "A" ] ]
df42[ [ "A" , "B" ] ]
A
B
a
0
1
b
3
4
c
6
7
d
9
10
e
12
13
df42. iloc[ : , 1 : 3 ]
B
C
a
1
2
b
4
5
c
7
8
d
10
11
e
13
14
get訪問列(結果爲一個Series)
df42. get( "B" )
a 1
b 4
c 7
d 10
e 13
Name: B, dtype: int32
df42. get( "B" ) . get( "a" )
1
通過屬性訪問,結果也是Series
df42. A
a 0
b 3
c 6
d 9
e 12
Name: A, dtype: int32
df42. A. a
0
df42. A[ : 2 ]
a 0
b 3
Name: A, dtype: int32
df42[ : 2 ]
df42. T
a
b
c
d
e
A
0
3
6
9
12
B
1
4
7
10
13
C
2
5
8
11
14
df42[ : : - 1 ]
A
B
C
e
12
13
14
d
9
10
11
c
6
7
8
b
3
4
5
a
0
1
2
四、DataFrame的統計相關操作
import numpy as np
import pandas as pd
x = np. arange( 15 ) . reshape( 5 , 3 )
df = pd. DataFrame( x, index= [ "a" , "b" , "c" , "d" , "e" ] , columns= [ "A" , "B" , "C" ] )
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
查看基本信息情況
df. info( )
<class 'pandas.core.frame.DataFrame'>
Index: 5 entries, a to e
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 5 non-null int32
1 B 5 non-null int32
2 C 5 non-null int32
dtypes: int32(3)
memory usage: 100.0+ bytes
查看列索引信息
df. columns
Index(['A', 'B', 'C'], dtype='object')
查看行索引信息
df. index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
獲取列表的值,結果爲二維數組
df. values
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
查看各列的統計值(純數據)
df. describe( )
A
B
C
count
5.000000
5.000000
5.000000
mean
6.000000
7.000000
8.000000
std
4.743416
4.743416
4.743416
min
0.000000
1.000000
2.000000
25%
3.000000
4.000000
5.000000
50%
6.000000
7.000000
8.000000
75%
9.000000
10.000000
11.000000
max
12.000000
13.000000
14.000000
查看每列的數據數目有多少個
df. count( )
A 5
B 5
C 5
dtype: int64
查看各列的平均值
df. mean( )
A 6.0
B 7.0
C 8.0
dtype: float64
各列最大值
df. max ( )
A 12
B 13
C 14
dtype: int32
各列最小值
df. min ( )
A 0
B 1
C 2
dtype: int32
按列統計表中的空值的數量
df. isnull( ) . sum ( )
A 0
B 0
C 0
dtype: int64
按列統計 表中大於10的元素個數
df. where( df> 10 ) . count( )
A 1
B 1
C 2
dtype: int64
根據列名A屬性進行分組,統計每一組的分佈情況
df. groupby( "A" ) . count( )
B
C
A
0
1
1
3
1
1
6
1
1
9
1
1
12
1
1
篩選出符合條件的行顯示出來
df[ df[ "A" ] > 3 ]
A
B
C
c
6
7
8
d
9
10
11
e
12
13
14
所有行都顯示,不符合條件的顯示爲NaN
df. where( df[ "B" ] > 3 )
A
B
C
a
NaN
NaN
NaN
b
3.0
4.0
5.0
c
6.0
7.0
8.0
d
9.0
10.0
11.0
e
12.0
13.0
14.0
行相關計算
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
df[ "A累加計算" ] = df[ "A" ] + df[ "A" ] . shift( )
df
A
B
C
A累加計算
a
0
1
2
NaN
b
3
4
5
3.0
c
6
7
8
9.0
d
9
10
11
15.0
e
12
13
14
21.0
列相關計算,都是一一對應關係
df
A
B
C
A累加計算
a
0
1
2
NaN
b
3
4
5
3.0
c
6
7
8
9.0
d
9
10
11
15.0
e
12
13
14
21.0
df[ "A" ] = df[ "C" ] + df[ "A" ]
df
A
B
C
A累加計算
a
2
1
2
NaN
b
8
4
5
3.0
c
14
7
8
9.0
d
20
10
11
15.0
e
26
13
14
21.0
df[ "A" ] = df[ "A" ] * 3
df
A
B
C
A累加計算
a
6
1
2
NaN
b
24
4
5
3.0
c
42
7
8
9.0
d
60
10
11
15.0
e
78
13
14
21.0
df[ "D" ] = df[ "A" ] + df[ "B" ] + df[ "C" ] * 2
df
A
B
C
A累加計算
D
a
6
1
2
NaN
11
b
24
4
5
3.0
38
c
42
7
8
9.0
65
d
60
10
11
15.0
92
e
78
13
14
21.0
119
import numpy as np
import pandas as pd
x = np. arange( 15 ) . reshape( 5 , 3 )
df = pd. DataFrame( x, index= [ "a" , "b" , "c" , "d" , "e" ] , columns= [ "A" , "B" , "C" ] )
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
值的算術中值(中位數)
df. median( )
A 6.0
B 7.0
C 8.0
dtype: float64
貝塞爾修正樣本標準差
df. std( )
A 4.743416
B 4.743416
C 4.743416
dtype: float64
無偏方差
df. var( )
A 22.5
B 22.5
C 22.5
dtype: float64
無偏協方差(二元)
df. cov( )
A
B
C
A
22.5
22.5
22.5
B
22.5
22.5
22.5
C
22.5
22.5
22.5
樣品偏斜度(三階矩)
df. skew( )
A 0.0
B 0.0
C 0.0
dtype: float64
樣品峯度(四階矩)
df. kurt( )
A -1.2
B -1.2
C -1.2
dtype: float64
樣本分位數(百分位上的值)
df. quantile( 0.75 )
A 9.0
B 10.0
C 11.0
Name: 0.75, dtype: float64
相關性計算,計算相關性時用到的方法有:
pearson:標準相關係數(默認)
kendall:Kendall Tau相關係數
Spearman:Spearman等級相關
df. corr( method= "pearson" )
A
B
C
A
1.0
1.0
1.0
B
1.0
1.0
1.0
C
1.0
1.0
1.0
rank 函數求出數據的排名順序,排序方法有:
average:組的平均排名
min:該組中的最低排名
max:該組中最高的排名
first:按排列順序出現在數組中
dense:類似於“最小”,但組之間的排名始終增加1
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
df. B. c = 33
df. B. a = 25
df. B. rank( method= "min" )
a 4.0
b 1.0
c 5.0
d 2.0
e 3.0
Name: B, dtype: float64
有時需要對不同窗口的中數據進行一個統計,通過 rolling 我們可以實現,設置 window=2 來保證窗口長度爲 2,設置 on=“A” 來保證這一列來滑動窗口(默認不設置,表示根據索引來歡動)。有些結果是缺失值,導致這個結果的原因是因爲在計算時,窗口中默認需要的最小數據個數與窗口長度一致,這裏可以設置 min_periods=1 來修改下。
df
A
B
C
a
0
1
2
b
3
4
5
c
6
7
8
d
9
10
11
e
12
13
14
df. rolling( window= 2 , on= "A" ) . sum ( )
A
B
C
a
0
NaN
NaN
b
3
5.0
7.0
c
6
11.0
13.0
d
9
17.0
19.0
e
12
23.0
25.0
df. rolling( window= 2 , on= "A" , min_periods= 1 ) . sum ( )
A
B
C
a
0
1.0
2.0
b
3
5.0
7.0
c
6
11.0
13.0
d
9
17.0
19.0
e
12
23.0
25.0
df. expanding( min_periods= 1 ) [ "A" , "B" ] . sum ( )
A
B
a
0.0
1.0
b
3.0
5.0
c
9.0
12.0
d
18.0
22.0
e
30.0
35.0
上面的方式只能生成一個結果,有時候想要同時求出多個結果(如求和與均值),則可利用agg方法:
df. rolling( window= 2 , min_periods= 1 ) [ "A" ] . agg( [ np. sum , np. mean, np. std] )
sum
mean
std
a
0.0
0.0
NaN
b
3.0
1.5
2.12132
c
9.0
4.5
2.12132
d
15.0
7.5
2.12132
e
21.0
10.5
2.12132
df. rolling( window= 2 , min_periods= 1 ) [ "A" ] . agg( { "A_sum" : np. sum , "A_mean" : np. mean, "A_std" : np. std} )
A_sum
A_mean
A_std
a
0.0
0.0
NaN
b
3.0
1.5
2.12132
c
9.0
4.5
2.12132
d
15.0
7.5
2.12132
e
21.0
10.5
2.12132