字典有一个单独的字典,我想在python的dataframe中对其进行转换,以便表中包含具有子列的列

2024-10-03 02:35:49 发布

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

Data=[{'endDate': {'raw': 1585612800, 'fmt': '2020-03-31'},
      'totalRevenue': {'raw': 67985000, 'fmt': '67.98M', 'longFmt': 
       '67,985,000'},
       'costOfRevenue': {'raw': 0, 'fmt': None, 'longFmt': '0'},
       'grossProfit': {'raw': 67985000, 'fmt': '67.98M', 'longFmt': 
        '67,985,000'},
       'sellingGeneralAdministrative': {'raw': 37779000,
        'fmt': '37.78M'}},
     {'endDate': {'raw': 1577750400, 'fmt': '2019-12-31'},
       'totalRevenue': {'raw': 79115000, 'fmt': '79.11M', 'longFmt': 
        '79,115,000'},
       'costOfRevenue': {'raw': 0, 'fmt': None, 'longFmt': '0'},
       'grossProfit': {'raw': 79115000, 'fmt': '79.11M', 'longFmt': 
        '79,115,000'},
       ' sellingGeneralAdministrative': {'raw': 36792000,
        'fmt': '36.79M',
        'longFmt': '36,792,000'}}]
 

   i want Data in this format

 Data =[{endDate:{'fmt':'2020-03-31'},
      totalRevenue:{'fmt':67.98M},
      costofRevenue:{'fmt':None}' and so on

即删除“原始”和“长FMT” 然后我希望它将dict列表转换为dataframe


Tags: innoneformatdatarawthiswantfmt
2条回答

pandas实际上不支持“子列”,正如您所要求的那样。不过,它确实支持以{'a': {'b': 'value'}}为您提供列a.b = 'value'的方式展平json对象。执行此操作的官方方法是json_normalize,并将像这样使用

import pandas as pd

income_statement_history = {
    "totalRevenue": {
        "raw": 67985000,
        "fmt": "67.98M",
        "longFmt": "67,985,000"
    },
    "costOfRevenue": {
        "raw": 0,
        "fmt": 'null',
        "longFmt": "0"
    },
    "grossProfit": {
        "raw": 67985000,
        "fmt": "67.98M",
        "longFmt": "67,985,000"
    },
    "totalOperatingExpenses": {
        "raw": 46790000,
        "fmt": "46.79M",
        "longFmt": "46,790,000"
    },
    "operatingIncome": {
        "raw": 21195000,
        "fmt": "21.2M",
        "longFmt": "21,195,000"
    }
}

df = pd.json_normalize(income_statement_history)

印刷df会给你

>>> df
   totalRevenue.raw totalRevenue.fmt totalRevenue.longFmt  costOfRevenue.raw costOfRevenue.fmt  ... totalOperatingExpenses.fmt  totalOperatingExpenses.longFmt operatingIncome.raw operatingIncome.fmt  operatingIncome.longFmt     
0          67985000           67.98M           67,985,000                  0              null  ...                     46.79M                      46,790,000            21195000               21.2M               21,195,000     

[1 rows x 15 columns]

您可以继续使用动态访问这些列值

>>> col = 'totalOperatingExpenses'
>>> subcol = 'longFmt'
>>> df[f'{col}.{subcol}']
0    46,790,000
Name: totalOperatingExpenses.longFmt, dtype: object

根据@Ann Zen的回答,可以选择pd.DataFrame初始化,也可以选择您一直使用的任何方法,这取决于您的确切需求

您的目标是基于json数据的列的直观处理吗?您的目标是否是访问给定子列名称和基列名称的子列的明确方式?我能想到的大多数答案都是基于偏好的,差别很小

下面是将多个类似的字典转换为数据帧的方法:

import pandas as pd

a = {...}
b = {...}

c = [a, b]
f = {'grossProfit':[], 'incomeBeforeTax':[], 'incomeTaxExpense':[]}
for e in c:
    for k in f.keys():
        f[d].append(e[d])

print(pd.DataFrame(f))

相关问题 更多 >