1. 程式人生 > >python -- 批量解析dataframe中的json串並形成新的欄位

python -- 批量解析dataframe中的json串並形成新的欄位

最近遇到了類似這樣的問題:批量解析資料庫中某張表的某一列(json串形式儲存),效果如下。

原始資料庫中的資料
圖1 原始資料庫中的資料
圖2 處理後的資料形式

為此,我編寫了如下的python指令碼

def main(table_source,var_name):
    """
    【批量解析json串】
    入參:
        table_source:含義:來自資料庫的庫名.表名,
                      格式:字串,
                      例如:'bestbuy_decision.streaming_target_info'
        var_name:含義:需要解析的欄位
                  格式:字串
                  例如:'data'
    
    使用範例:
        data = main(table_source,var_name)
    """
    sql_command = "SELECT * FROM  "+ str(table_source)
    data_list = connect_mysql(str(sql_command),command_type='select')                    #從TiDB取數
    data = pd.DataFrame(data_list)                                                       #將取到的數轉為DataFrame格式
    data['columns'] = data[str(var_name)].map(lambda x:list(json.loads(x).keys()))       #新增一列'columns'用於儲存每一列的json串的欄位名
    add_columns_list =list(set( list(chain(*data['columns'] ))))                         #獲取json串中的所有欄位名稱
    for columns in add_columns_list:
        data[str(columns)] = data['data'].map(lambda x:json.loads(x).get(str(columns)))  #將json串展開
    del data['columns']                                                                  #刪除無用欄位columns
    return data                                                                          #返回處理過後的資料    

使用上述函式可以實現從圖1到圖2的效果。

我自己測試,100+w行的資料(欄位數40左右)大概需要10分鐘。