DataFrame的基礎應用

一、DataFrame簡介

DataFrame是一個帶有索引的二維數據結構,每列可以有自己的名字,並且可以有不同的數據類型。你可以把它想象成一個excel表格或者數據庫中的一張表,DataFrame是最常用的Pandas對象。如下圖所示:

圖1

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]
# 有點類似於Series
pd.DataFrame(lst)
0
0 1
1 2
2 3
import pandas as pd
lst = [[1,2,3],[2,3,4]]
pd.DataFrame(lst)
0 1 2
0 1 2 3
1 2 3 4
# 列表內的元素不等時自動爲NaN
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}
# pd.DataFrame(data=dic)
# 這種方式是不行的,因爲Data必須死類似列表的數據
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) 
# 自動根據行列索引將數據對齊,缺少的爲NaN
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) # item 要彈出的列的標籤。

3.2.1 行刪除

根據行索引,指定位置刪除行

# axis爲0表示刪除行。inplace爲True表示直接對原表修改。
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 列刪除

根據列索引,指定位置刪除列

# axis爲1表示刪除列,inplace爲True表示直接對原表修改。
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
C
a 2
b 5
c 8
d 11
e 14

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]
A B C
c 6 7 8
df41[:3]
A B C
a 0 1 2
b 3 4 5
c 6 7 8

獲取某行或某幾行

df41.loc["a"] # 按index選取行
A    0
B    1
C    2
Name: a, dtype: int32
df41.loc["a":"c"] # 選取index "a"到“c”的行
A B C
a 0 1 2
b 3 4 5
c 6 7 8
df41.iloc[1:2,:]
A B C
b 3 4 5

獲取指定位置元素

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]
B C
a 1 2
b 4 5
c 7 8

查看前n行

df41.head(2)
A B C
a 0 1 2
b 3 4 5

查看後n行

df41.tail(2)
A B C
d 9 10 11
e 12 13 14

3.4.2 查看列

df42 = df.copy()
df42[["A"]]
A
a 0
b 3
c 6
d 9
e 12
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
# 從Series 中繼續訪問
df42.get("B").get("a")
1

通過屬性訪問,結果也是Series

df42.A
a     0
b     3
c     6
d     9
e    12
Name: A, dtype: int32
# 從Series 中繼續訪問
df42.A.a
0
df42.A[:2] # 訪問前兩行
a    0
b    3
Name: A, dtype: int32
df42[:2] # 獲取整個DataFrame的前兩行
A B C
a 0 1 2
b 3 4 5
# 對DataFrame行列位置互換,相當於矩陣轉置
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不計算
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不計算
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章