全部產品
Search
文件中心

:建立DataFrame

更新時間:Jun 08, 2024

本文為您介紹如何建立DataFrame引用資料來源。

前提條件

操作下述程式碼範例前,您需要先準備好樣本表pyodps_iris,詳細操作請參見Dataframe資料處理

背景資訊

在使用DataFrame時,您需要瞭解CollectionDataFrame)、SequenceScalar三類對象的操作。三類對象分別表示表結構(或者二維結構)、列(一維結構)和標量。

您使用Pandas建立的資料對象包含實際資料,但通過MaxCompute表建立的對象並不包含實際資料,僅包含對資料的操作。MaxCompute完成資料存放區和計算。

建立DataFrame

您唯一需要直接建立的Collection對象是DataFrame。DataFrame用於引用MaxCompute表、MaxCompute分區、Pandas DataFrame或Sqlalchemy Table(資料庫表)資料來源。這幾種資料來源的操作相同,您可以不更改資料處理代碼,僅修改輸入和輸出指向,便可以將本地啟動並執行小資料量測試代碼遷移到MaxCompute,遷移正確性由PyODPS保證。

從MaxCompute表建立DataFrame

從MaxCompute表建立DataFrame,您需要將Table對象傳入DataFrame方法,或者使用表的to_df方法。程式碼範例如下:

from odps.df import DataFrame

# 傳入Table對象。
iris = DataFrame(o.get_table('pyodps_iris'))
# 使用表的to_df方法。
iris2 = o.get_table('pyodps_iris').to_df() 

從MaxCompute分區建立DataFrame

從MaxCompute分區建立DataFrame,您需要將分區對象傳入DataFrame方法,或者使用分區的to_df方法。程式碼範例如下:

from odps.df import DataFrame

# (可選)建立partitioned_table分區表。若已有分區表,可根據實際情況替換partitioned_table。
o.create_table('partitioned_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)
# 傳入Table對象。
pt_df = DataFrame(o.get_table('partitioned_table').get_partition('pt=20171111'))
# 使用分區的to_df方法。
pt_df2 = o.get_table('partitioned_table').get_partition('pt=20171111').to_df();

從Pandas DataFrame建立DataFrame

從Pandas DataFrame建立DataFrame,您需要將Pandas DataFrame對象傳入DataFrame方法。

  • 程式碼範例

    from odps.df import DataFrame
    
    # 從Pandas DataFrame建立DataFrame。
    import pandas as pd
    import numpy as np
    df = DataFrame(pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('abc')))
    
  • 注意事項

    用Pandas DataFrame初始化時:

    • PyODPS DataFrame會嘗試對NUMPY OBJECT或STRING類型進行推斷。如果一整列都為空白,則會報錯。為避免報錯,您可以設定unknown_as_string值為True,將這些列指定為STRING類型。

    • 您可以通過as_type參數,強制轉換類型。如果類型為基本類型,會在建立PyODPS DataFrame時強制轉換類型。如果Pandas DataFrame中包含LIST或DICT列,系統不會推斷該列的類型,必須手動使用as_type指定類型。as_type參數類型必須是DICT。

    樣本:

    • 樣本1:指定null_col2列類型為float

      df2 = DataFrame(df, unknown_as_string=True, as_type={'null_col2': 'float'})
      print(df2.dtypes)

      返回結果:

      odps.Schema {
        sepallength           float64
        sepalwidth            float64
        petallength           float64
        petalwidth            float64
        name                  string
        null_col1             string   # 無法識別,通過unknown_as_string設定成STRING類型。
        null_col2             float64  # 強制轉換成FLOAT類型。
      }
    • 樣本2:指定list_col列類型為list<int64>

      df4 = DataFrame(df3, as_type={'list_col': 'list<int64>'})
      print(df4.dtypes)

      返回結果:

      odps.Schema {
        id        int64
        list_col  list<int64>  # 無法識別且無法自動轉換,通過as_type設定。
      }
    說明

    PyODPS不支援上傳OSS或OTS外部表格。

從Sqlalchemy Table建立DataFrame

從Sqlalchemy Table建立DataFrame,您需要將Sqlalchemy Table對象傳入DataFrame方法,Sqlalchemy建立串連及相關參數說明請參見建立串連。程式碼範例如下:

from odps.df import DataFrame
import sqlalchemy

# 從Sqlalchemy Table建立DataFrame。
# 確保 ALIBABA_CLOUD_ACCESS_KEY_ID 環境變數設定為使用者 Access Key ID,
# ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境變數設定為使用者 Access Key Secret,
# 不建議直接使用 Access Key ID / Access Key Secret 字串
conn_string = 'odps://%s:%s@<project>/?endpoint=<endpoint>' % (
    os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
engine = sqlalchemy.create_engine(conn_string)
metadata = sqlalchemy.MetaData(bind=engine) # 需要綁定到Engine。
table = sqlalchemy.Table('pyodps_iris', metadata, extend_existing=True, autoload=True)
iris = DataFrame(table)