1. 程式人生 > >python pandas 之 Dataframe 資料結構

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