python pandas 之 Dataframe 資料結構
DataFrame 是 pandas 中兩個主要資料結構之一,另一個是 Series。DataFrame 的文件在這裡:傳送門。
因為這幾天需要使用這個資料結構來完成一個小作業,在這裡總結一下 Dataframe 的一些基本用法。
文章目錄
建立
首先我們來看一看 Dataframe 的建立,Dataframe 文件裡給出的建構函式是:
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
其中 data 的型別可以是 numpy ndarray、字典或者 Dataframe。相當於是你構造 DataFrame 的初始值。
index 是行索引,columns 是列索引,我看的這兩個一般都給的是列表。
dtype 是指定 data 裡元素的資料型別。上面那個連結給的例子裡有涉及到這一項,可以去看看。
我們來看一個例項
>>> import pandas as pd
>>> from pandas import DataFrame
>>> data = {'state':['ok', 'normal', 'good', 'bad'],
'year':[2000, 2001, 2002, 2003],
'pop':[3.7, 3.6, 2.4, 0.9]}
>>> print(DataFrame(data)) # 行索引 index 預設為0,1,2,3
state year pop
0 ok 2000 3.7
1 normal 2001 3.6
2 good 2002 2.4
3 bad 2003 0.9
>>> print(DataFrame(data, index = ['one', 'two', 'three', 'four'])) # 指定行索引
state year pop
one ok 2000 3.7
two normal 2001 3.6
three good 2002 2.4
four bad 2003 0.9
>>> print(DataFrame(None, index=range(3), columns=range(4))) # data 預設是 None,第一個我們不寫也會得到下面結果
0 1 2 3
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
>>> print(DataFrame(2, index=range(3), columns=range(4)))
0 1 2 3
0 2 2 2 2
1 2 2 2 2
2 2 2 2 2
有一些函式返回的資料型別也是 DataFrame,比如 DataFrame.from_dict, pandas.read_csv, pandas.read_table, pandas.read_clipboard 等(這個可以看文件)
元素訪問
想要獲取 DataFrame 結構中某一元素,我們可以像陣列一樣訪問
值得注意的是:這個資料結構是按先列後行
來進行索引的。
>>> dataframe = DataFrame(2, index=range(3), columns=range(4))
>>> dataframe
0 1 2 3
0 2 2 2 2
1 2 2 2 2
2 2 2 2 2
>>> dataframe[3][2] # 訪問第 3 列第 2 行的資料
2
>>> type(dataframe[3][2])
<class 'numpy.int64'>
# 可以使用 ix 屬性來按 先行後列 訪問資料
>>> dataframe.ix[2, 1] # 訪問第 2 行,第 1 列的資料
2
獲取行列
想要獲取其中的某一行或某一列,可以直接使用索引即可
下圖來自參考資料第一個連結,侵刪。
# 先簡單介紹下 nparray
>>> import numpy as np
>>> np.arange(4)
array([0, 1, 2, 3])
>>> np.arange(16).reshape((2, 8)) # 將 nparray 拆分成 2×8 的格式
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15]])
# 建立一個 4 行 2 列的 DataFrame
>>> dataframe = DataFrame(np.arange(8).reshape((4, 2)),
index=['zero', 'one', 'two', 'three'])
>>> dataframe
0 1
zero 0 1
one 2 3
two 4 5
three 6 7
>>> dataframe[0] # 獲取第 0 列
zero 0
one 2
two 4
three 6
Name: 0, dtype: int32
>>> dataframe.ix[1] # 獲取第 1 行
0 2
1 3 # 這裡解釋下:第一列 0 1 是索引資訊,後一列 2 3 是行資料,不過把它豎起來了。
Name: zero, dtype: int32
>>> dataframe.ix['one'] # 獲取第 1 行
0 2
1 3
Name: zero, dtype: int32
>>> type(dataframe[0])
<class 'pandas.core.series.Series'>
常用屬性
沒介紹的不代表不常用,而是我就知道下面倆
矩陣轉置
將矩陣轉置十分簡單,用屬性 T 即可。我覺得用處是當你記不住咋獲取行的時候,轉置獲取是一個不錯的方法。
>>> dataframe = DataFrame(np.arange(8).reshape((4, 2)), index=['zero', 'one', 'two', 'three'])
>>> dataframe
0 1
zero 0 1
one 2 3
two 4 5
three 6 7
>>> dataframe.T
zero one two three
0 0 2 4 6
1 1 3 5 7
元素個數
使用 size 屬性就可以了
>>> dataframe.size
8
行元素個數
>>> dataframe.iloc[:,0].size # 這裡用到了切片。對 python 基本的切片還有點印象的同學應該可以回想起來 : 啥也不寫表示一個拷貝。
4
列元素個數
>>> dataframe.columns.size
2
操作
遍歷
行遍歷
對行進行遍歷可以使用 dataframe.values 返回的 ndarry 進行遍歷。
>>> dataframe.values
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
>>> type(dataframe.values)
<class 'numpy.ndarray'>
>>> for row in dataframe.values:
for i in range(row.size):
print(row[i])
0
1
2
3
4
5
6
7
當然,其實 DataFrame 也已經給我們封裝好了函式:DataFrame.iterrows() 以及 DataFrame.itertuples()
兩者官方文件裡更推薦使用 itertuples()。具體的使用文件裡比較詳細,這裡就不提了。
列遍歷
列遍歷可以通過先將矩陣轉置再遍歷行。我覺得應該也有函式,但是由於學識所限,目前還不太瞭解。
求和
行求和
>>> dataframe
0 1
zero 0 1
one 2 3
two 4 5
three 6 7
>>> dataframe.sum(axis=1)
zero 1
one 5
two 9
three 13
dtype: int64
列求和
>>> dataframe.sum()
0 12
1 16
dtype: int64
判等
判斷兩個 DataFrame 是否相等可以使用 DataFrame 的 equal() 方法。
# 下面建立了兩個 DataFrame
>>> dataframe1 = pd.DataFrame(np.arange(2, 10).reshape(4, 2))
>>> dataframe2 = pd.DataFrame(np.arange(8).reshape(4, 2))
>>> dataframe1
0 1
0 2 3
1 4 5
2 6 7
3 8 9
>>> dataframe2
0 1
0 0 1
1 2 3
2 4 5
3 6 7
>>> dataframe1.equals(dataframe2)
False
>>> dataframe3 = pd.DataFrame(np.arange(8).reshape(4, 2))
>>> dataframe2.equals(dataframe3)
True
儲存
DataFrame 有一系列的以 to_
開頭的函式支援將 DataFrame 寫入到不同格式的檔案中。具體的可以在文件裡 C-f 搜尋。
這裡我比較喜歡的是 to_html(檔案路徑) 這個函式,也不需要額外的包什麼的,拿來即用,下面是效果:
可以看到是十分的整齊簡單~
如果你不想要 0-14 那些索引資訊的話,可以設定 header=None 或者 index=None
來隱藏
參考資料
https://blog.csdn.net/cxmscb/article/details/54632492
https://blog.csdn.net/jinlong_xu/article/details/61193418