數據分析篇 | 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  

indexcolumns 屬性分別用於訪問行、列標籤:

指定列與數據字典一起傳遞時,傳遞的列會覆蓋字典的鍵。

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  

【完】