2020,努力做一個無可替代的人!
寫在前面的話
如果你還記得那年大明湖畔的xiaoyige,那你就應該來看看這篇文章
我們學的是技術,小一我寫的可是技術文章,哪來那麼多情啊愛啊的
今天的內容很重要的!
先複習一下前面的文章:
可能有的同學不理解複習的意義,我簡單說一下:
我寫系列文章的時候都會先列好整個系列的大綱,甚至有時候幾篇文章是同一天肝出來的。
這就造成有時候這一篇文章的概念會及其依賴上一篇文章,所以呢,花個兩三分鐘複習一下上一篇,你會更好理解這篇文章。
正文
今天介紹潘大師的另一種數據結構:Dataframe,一個表格型的數據結構。
對於Series 我們只用了一小節介紹,而Dataframe 可能會用三節內容,孰輕孰重應該都清楚吧
學習DataFrame,小一建議你最好和Excel表格聯繫起來
Excel 表格有行索引、列索引,有數據塊,有數據的查找、替換、去重,有數據的透視,彙總,有不同表的數據匹配等等這些。
DataFrame 的初衷就是爲了解決這些問題,簡潔、易用的功能也是作者最初的願景
所以 ,後面的系列文章,如果你對某個概念不是很理解,想一想 Excel 中是怎麼表述的
創建 DataFrame
先來一個DataFrame 介紹三連
DataFrame 有行(索引)、有列(索引),可以看做是由一個個的Series 組成的字典。
DataFrame 每列可以是不同的值類型(數值、字符串、布爾值)
DataFrame 中的數據是以一個或多個二維塊存放的
那DataFrame 都有哪些創建方式?
和NumPy 一樣,DataFrame 創建方式也有很多種
常見的有:
-
通過二維ndarray 創建
-
通過字典創建
-
通過列表創建
-
通過另一個DataFrame 創建
下面簡單介紹一下常用的,剩下的同學們自己拓展
通過二維ndarray創建DataFrame
創建一個二維的ndarray 數組,該數組即DataFrame 的數據集
# 通過二維ndarray創建DataFrame
arr_data = np.arange(12).reshape(3, 4)
df_data1 = pd.DataFrame(arr_data)
# 輸出
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
結果DataFrame 會自動加上行索引和列索引,和Series 的創建一樣
那應該怎麼顯示聲明行、列索引?
也和Series 的創建一樣,在創建的時候手動指定就行
# 通過二維ndarray創建DataFrame
columns = ['one', 'two', 'three', 'four']
index = ['a', 'b', 'c']
# 顯示指定行、列索引
df_data1 = pd.DataFrame(arr_data, columns=columns, index=index)
# 輸出
one two three four
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
記住列索引(想要成Excel 的列名):columns
行索引(想象成Excel 的序號):index
默認的行列索引都是從0開始
通過字典創建DataFrame
這裏面的字典包括很多,比如:
- 數組、元祖 、列表 組成的字典
- 字典組成的字典(嵌套)
- Series 組成的字典
只要數據是字典格式,就可以做數據集
字典的key作爲DataFrame的行索引
# 通過字典創建DataFrame
dict_data = {
'name': ['xiaoyi', 'xiaosi', 'xiaoqi'],
'age': [11, 14, 17],
'score': [95.5, 94.5, 97]
}
df_data2 = pd.DataFrame(dict_data)
# 輸出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
列索引是字典的 key 值,行索引自動填充
當然字典裏面的值數據類型你可以盡情變化,Series、元祖、列表等都是可以的
通過列表創建DataFrame
同樣的,這裏的列表類型也不止一種:
- 字典組成的列表
- Series 組成的列表
# 通過列表創建DataFrame
list_data = [
{'one': 1, 'two': 2},
{'one': 1, 'two': 2, 'three': 4}
]
df_data3 = pd.DataFrame(list_data)
# 輸出
one two three
0 1 2 NaN
1 1 2 4.0
主要就是這三種創建方式,有些書上寫的過於複雜,讓人眼花繚亂
萬變不離其宗,核心就是這三種
至於第四種通過其他DataFrame創建,就不多說了吧?
經常讀我文章的同學要是會了前三種,還不會第四種?
不妨看一下NumPy 的數組創建?順便反思一下?
索引對象
DataFrame 已經創建好了,但是索引還不太明白,是和Series的一樣嗎?
能想到Series,說明你差不多都知道是怎麼回事了
構建Series 或者DataFrame 時,所用到的任何數據的標籤都會被轉換成Index對象
Index 對象是不可修改的,這樣可以保證多個數據結構之間的安全共享
畢竟人家可是索引,你索引要是都一樣了,那到底應該指向誰就說不清了
我們可以使用重新索引的方法 reindex
reindex 的用處相當大,我詳細介紹一下參數
reindex(index, method, fille_value, limit, level, copy)
參數 | 說明 |
---|---|
index | 用作索引的新序列 |
method | 插值(填充)方式,包括:ffill(前向填充值)、bfill(後向填充值) |
fill_value | 在重新索引的過程中,需要引入缺失值時使用的替代值 |
limit | 前向或後向填充時的最大填充量 |
在DataFrame中,存在行、列索引,不同於Series 中只有單一索引。
所以DataFrame中 reindex 可以行、列索引都修改
先看單一索引
# 創建 Series
series_data = pd.Series([1, 2, 4, 5], index=['a', 'b', 'c', 'e'])
# 輸出
a 1
b 2
c 4
e 5
dtype: int64
# 重新索引
series_data = series_data.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=-1)
# 輸出
a 1
b 2
c 4
d -1
e 5
dtype: int64
reindex 會根據新索引進行重排,如果某個索引值不存在,則使用 fille_value 的值進行填充
還記得前面說的DataFrame 中行、列索引分別是什麼嗎?
- 行索引:index (想象成Excel 中的序號)
- 列索引:columns (想象成Excel 中的列標籤)
df_data2
# 輸出
name age score
0 xiaoyi 11 95.5
1 xiaosi 14 94.5
2 xiaoqi 17 97.0
# 行、列重新索引
columns = ['name', 'age', 'score', 'score2']
index = [0, 1, 2, 3]
df_data2 = df_data2.reindex(index=index, columns=columns)
# 輸出
name age score score2
0 xiaoyi 11.0 95.5 NaN
1 xiaosi 14.0 94.5 NaN
2 xiaoqi 17.0 97.0 NaN
3 NaN NaN NaN NaN
對行、列都進行重新索引,索引值不存在的會用空值填充
索引很重要,是Pandas 數據模型的重要部分,但是我們瞭解上面的內容就夠了,也沒必要去深究它。
總結一下:
今天主要介紹了DataFrame 的創建和索引的相關操作。
創建方法也是一如既往的多,不過不要慌,真正用起來的時候基本都是從文件中讀數據,就一個方法。
索引這一塊不要搞混行索引、列索引。
對於索引的一些方法最好是掌握,我寫出來的都是常用的,不是常用的我也懶得寫,你要是還糾結那就查API 文檔細品吧
寫在後面的話
每天進步一點點,學習不就是這麼來的嗎?
寫這篇文章的時候,我接到了一個關係很好的朋友的消息。
他的考研成績公佈了,邊工作邊複習的他,考研歷程是我認識的人中最艱難的、最辛苦的。
等他有空,我去取取經,投稿部分應該會有新文章,期待一下
碎碎念一下
上一節碎碎念太多,一下沒控制住自己
算算時間,去年十二月份定下的小目標:每週兩篇原創文 ,除了春節期間,應該都實現了。
原創不易,歡迎點贊噢
文章首發:公衆號【知秋小一】
文章同步:掘金,簡書,csdn
原文鏈接:《愛上潘大師》系列- 你還記得那年的DataFrame 嗎