數據分析篇 | Pandas數據結構之DataFrame
- 2019 年 12 月 11 日
- 筆記
以下文章來源於Python大咖談,作者吱吱不倦的呆鳥
- 用 Series 字典或字典生成 DataFrame
- 用多維數組字典、列表字典生成 DataFrame
- 用結構多維數組或記錄多維數組生成 DataFrame
- 用列表字典生成 DataFrame
- 用元組字典生成 DataFrame
- 用 Series 創建 DataFrame
- 備選構建器
DataFrame 是由多種類型的列構成的二維標籤數據結構,類似於 Excel 、SQL 表,或 Series 對象構成的字典。DataFrame 是最常用的 Pandas 對象,與 Series 一樣,DataFrame 支援多種類型的輸入數據:
- 一維 ndarray、列表、字典、Series 字典
- 二維 numpy.ndarray
- 結構多維數組或記錄多維數組
Series
DataFrame
除了數據,還可以有選擇地傳遞 index(行標籤)和 columns(列標籤)參數。傳遞了索引或列,就可以確保生成的 DataFrame 里包含索引或列。Series 字典加上指定索引時,會丟棄與傳遞的索引不匹配的所有數據。
沒有傳遞軸標籤時,按常規依據輸入數據進行構建。
Python > = 3.6,且 Pandas > = 0.23,數據是字典,且未指定
columns
參數時,DataFrame
的列按字典的插入順序排序。 Python < 3.6 或 Pandas < 0.23,且未指定columns
參數時,DataFrame
的列按字典鍵的字母排序。
用 Series 字典或字典生成 DataFrame
生成的索引是每個 Series 索引的並集。先把嵌套字典轉換為 Series。如果沒有指定列,DataFrame 的列就是字典鍵的有序列表。
In [37]: d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']), ....: 'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} ....: In [38]: df = pd.DataFrame(d) In [39]: df Out[39]: one two a 1.0 1.0 b 2.0 2.0 c 3.0 3.0 d NaN 4.0 In [40]: pd.DataFrame(d, index=['d', 'b', 'a']) Out[40]: one two d NaN 4.0 b 2.0 2.0 a 1.0 1.0 In [41]: pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three']) Out[41]: two three d 4.0 NaN b 2.0 NaN a 1.0 NaN
index 和 columns 屬性分別用於訪問行、列標籤:
指定列與數據字典一起傳遞時,傳遞的列會覆蓋字典的鍵。
In [42]: df.index Out[42]: Index(['a', 'b', 'c', 'd'], dtype='object') In [43]: df.columns Out[43]: Index(['one', 'two'], dtype='object')
用多維數組字典、列表字典生成 DataFrame
多維數組的長度必須相同。如果傳遞了索引參數,index
的長度必須與數組一致。如果沒有傳遞索引參數,生成的結果是 range(n)
,n
為數組長度。
In [44]: d = {'one': [1., 2., 3., 4.], ....: 'two': [4., 3., 2., 1.]} ....: In [45]: pd.DataFrame(d) Out[45]: one two 0 1.0 4.0 1 2.0 3.0 2 3.0 2.0 3 4.0 1.0 In [46]: pd.DataFrame(d, index=['a', 'b', 'c', 'd']) Out[46]: one two a 1.0 4.0 b 2.0 3.0 c 3.0 2.0 d 4.0 1.0
用結構多維數組或記錄多維數組生成 DataFrame
本例與數組字典的操作方式相同。
In [47]: data = np.zeros((2, ), dtype=[('A', 'i4'), ('B', 'f4'), ('C', 'a10')]) In [48]: data[:] = [(1, 2., 'Hello'), (2, 3., "World")] In [49]: pd.DataFrame(data) Out[49]: A B C 0 1 2.0 b'Hello' 1 2 3.0 b'World' In [50]: pd.DataFrame(data, index=['first', 'second']) Out[50]: A B C first 1 2.0 b'Hello' second 2 3.0 b'World' In [51]: pd.DataFrame(data, columns=['C', 'A', 'B']) Out[51]: C A B 0 b'Hello' 1 2.0 1 b'World' 2 3.0
DataFrame 的運作方式與 NumPy 二維數組不同。
用列表字典生成 DataFrame
In [52]: data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] In [53]: pd.DataFrame(data2) Out[53]: a b c 0 1 2 NaN 1 5 10 20.0 In [54]: pd.DataFrame(data2, index=['first', 'second']) Out[54]: a b c first 1 2 NaN second 5 10 20.0 In [55]: pd.DataFrame(data2, columns=['a', 'b']) Out[55]: a b 0 1 2 1 5 10
用元組字典生成 DataFrame
元組字典可以自動創建多層索引 DataFrame。
In [56]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, ....: ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, ....: ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, ....: ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, ....: ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) ....: Out[56]: a b b a c a b A B 1.0 4.0 5.0 8.0 10.0 C 2.0 3.0 6.0 7.0 NaN D NaN NaN NaN NaN 9.0
用 Series 創建 DataFrame
生成的 DataFrame 繼承了輸入的 Series 的索引,如果沒有指定列名,默認列名是輸入 Series 的名稱。
缺失數據
更多內容,詳見缺失數據 。DataFrame 里的缺失值用 np.nan
表示。DataFrame 構建器以 numpy.MaskedArray
為參數時 ,被屏蔽的條目為缺失數據。
備選構建器
DataFrame.from_dict
DataFrame.from_dict
接收字典組成的字典或數組序列字典,並生成 DataFrame。除了 orient
參數默認為 columns
,本構建器的操作與 DataFrame
構建器類似。把 orient
參數設置為 'index'
, 即可把字典的鍵作為行標籤。
In [57]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])])) Out[57]: A B 0 1 4 1 2 5 2 3 6
orient='index'
時,鍵是行標籤。本例還傳遞了列名:
In [58]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), ....: orient='index', columns=['one', 'two', 'three']) ....: Out[58]: one two three A 1 2 3 B 4 5 6
DataFrame.from_records
DataFrame.from_records
構建器支援元組列表或結構數據類型(dtype
)的多維數組。本構建器與 DataFrame
構建器類似,只不過生成的 DataFrame 索引是結構數據類型指定的欄位。例如:
In [59]: data Out[59]: array([(1, 2., b'Hello'), (2, 3., b'World')], dtype=[('A', '<i4'), ('B', '<f4'), ('C', 'S10')]) In [60]: pd.DataFrame.from_records(data, index='C') Out[60]: A B C b'Hello' 1 2.0 b'World' 2 3.0
【完】