有没有办法把yaml转换成数据帧?或者以某种方式扁平化或规范化许多呈现为JSON的数据集?

2024-09-29 19:36:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个数据集如下所示:

{'class': 'pipesteps.validate.Validate', 'conf': {'schema_def': {'fields': [{'data_type': 'STRING', 'name': 'Operation'}, {'data_type': 'STRING', 'name': 'SNL_Institution_Key'}, {'data_type': 'INTEGER', 'name': 'SNL_Funding_Key'}, {'data_type': 'STRING', 'name': 'CUSIP'}, {'data_type': 'STRING', 'name': 'SEDOL_NULL'}, {'data_type': 'STRING', 'name': 'Ticker'}, {'data_type': 'DATETIME', 'name': 'Date_of_Closing_Price'}, {'data_type': 'FLOAT', 'name': 'Total_Return_MTD'}, {'data_type': 'FLOAT', 'name': 'TR_SNL_Peer_Index_Change'}, {'data_type': 'FLOAT', 'name': 'TR_SNL_Broad_Index_Change'}, {'data_type': 'FLOAT', 'name': 'TR_SandP_500'}, {'data_type': 'DATETIME', 'name': 'Beginning_Pricing_Date'}]}}, 'id': 'validate'}

几乎所有的东西都被组织成“数据类型”或“名称”。在

在一个文本文件中嵌入了几十个这样的数据集。每个集合以'class': 'pipesteps.validate.Validate'开头,以'id': 'validate'结尾。我试图将这些数据组织成一个单独的数据帧,或者以某种方式将其扁平化/标准化,这样人们就更容易阅读。我怎么能做到呢?在

我猜有一个简单而直接的方法来完成所有这些,但是在Google上搜索了一段时间后,我仍然找不到解决方案,所以我回到这里。蒂娅。在


Tags: 数据keynamedatadatetimedatestringtype
1条回答
网友
1楼 · 发布于 2024-09-29 19:36:16

这将递归地将值提取到一个平坦的dict中,并且每个级别的“平坦化”将组合成每个键的最终字符串。因此,如果展平的级别为0(对象已经是dict),它将如您所期望的类:验证步骤.pipevalidate. 如果它很深,那么你会看到会发生什么:

from pandas.io.json import json_normalize

a = {'class': 'pipesteps.validate.Validate', 'conf': {'schema_def': {'fields': [{'data_type': 'STRING', 'name': 'Operation'}, {'data_type': 'STRING', 'name': 'SNL_Institution_Key'}, {'data_type': 'INTEGER', 'name': 'SNL_Funding_Key'}, {'data_type': 'STRING', 'name': 'CUSIP'}, {'data_type': 'STRING', 'name': 'SEDOL_NULL'}, {'data_type': 'STRING', 'name': 'Ticker'}, {'data_type': 'DATETIME', 'name': 'Date_of_Closing_Price'}, {'data_type': 'FLOAT', 'name': 'Total_Return_MTD'}, {'data_type': 'FLOAT', 'name': 'TR_SNL_Peer_Index_Change'}, {'data_type': 'FLOAT', 'name': 'TR_SNL_Broad_Index_Change'}, {'data_type': 'FLOAT', 'name': 'TR_SandP_500'}, {'data_type': 'DATETIME', 'name': 'Beginning_Pricing_Date'}]}}, 'id': 'validate'}

def flatten_json(y):
    out = {}
    # some recursion
    def flatten(x, name=''):
        if type(x) is dict:
            for a in x:
                flatten(x[a], name + a + '_')
        elif type(x) is list:
            i = 0
            for a in x:
                flatten(a, name + str(i) + '_')
                i += 1
        else:
            out[name[:-1]] = x

    flatten(y)
    return out

flat_json = flatten_json(a)
df = (json_normalize(flat_json)).T # .T because it makes a DF of 1 row and 26 columns and I didn't like that

如果您不希望它被转置,只需要26列,因为这样可能更容易访问数据,那么只需去掉df末尾的.t

输出:

^{pr2}$

相关问题 更多 >

    热门问题