字典中的字典到熊猫数据框

Posted

技术标签:

【中文标题】字典中的字典到熊猫数据框【英文标题】:Dict in List in Dict to pandas dataframe 【发布时间】:2021-07-17 21:45:13 【问题描述】:

我想我正在从 API 接收字典内的列表内的字典。如何将其转换为 pandas 数据框?

当我使用 pandas.dataframe.from_dict() 时,输出只是每个元素中的一个字典,而不是拆分字典。

a= 'count': 10465,
 'status': 'DELAYED',
 'tickers': ['day': 'c': 48.11,
    'h': 49.61,
    'l': 48.11,
    'o': 48.36,
    'v': 2018543,
    'vw': 48.6329,
   'lastQuote': 'P': 48.07,
    'S': 50,
    'p': 48.02,
    's': 3,
    't': 1619195328041448704,
   'lastTrade': 'c': None,
    'i': '71683813093722',
    'p': 48.04,
    's': 100,
    't': 1619195306417034752,
    'x': 4,
   'min': 'av': 2018540,
    'c': 48.11,
    'h': 48.19,
    'l': 48.11,
    'o': 48.19,
    'v': 8842,
    'vw': 48.1468,
   'prevDay': 'c': 47.83,
    'h': 49.54,
    'l': 47.07,
    'o': 47.9,
    'v': 4938809,
    'vw': 48.3369,
   'ticker': 'FTCH',
   'todaysChange': 0.21,
   'todaysChangePerc': 0.439,
   'updated': 1619195306417034752,
  'day': 'c': 4.01,
    'h': 4.09,
    'l': 4.01,
    'o': 4.03,
    'v': 12077,
    'vw': 4.0342,
   'lastQuote': 'P': 4.09, 'S': 3, 'p': 4, 's': 7, 't': 1619195239632140363,
   'lastTrade': 'c': [14, 41],
    'i': '4',
    'p': 4.01,
    's': 100,
    't': 1619195239632141482,
    'x': 21,
   'min': 'av': 12077,
    'c': 4.01,
    'h': 4.01,
    'l': 4.01,
    'o': 4.01,
    'v': 100,
    'vw': 4.01,
   'prevDay': 'c': 4.03,
    'h': 4.07,
    'l': 4.01,
    'o': 4.05,
    'v': 39628,
    'vw': 4.038,
   'ticker': 'METC',
   'todaysChange': -0.02,
   'todaysChangePerc': -0.496,
   'updated': 1619195280000000000
]

预期结果:

Ticker  day_c   min_c
FTCH     48.11   48.11
METC      4.01    4.01 

【问题讨论】:

你能编辑你的问题并把预期的结果放在那里吗? @AndrejKesely 好的,我添加了预期的结果。我正在拉 [day][c] 和 [min][c] 和 [ticker] 【参考方案1】:

有点矫枉过正,但你可以使用jmespath;当您的嵌套数据变得更加嵌套时,它会派上用场。

基本用法:如果访问一个键,使用.,如果遍历一个数组/列表,使用[]

extract = jmespath.search("""ticker: tickers[].ticker, 
                              day_c: tickers[].day.c, 
                              min_c: tickers[].min.c
                           """, a)

 extract
 'ticker': ['FTCH', 'METC'], 'day_c': [48.11, 4.01], 'min_c': [48.11, 4.01]

pd.DataFrame(extract)
 
  ticker  day_c  min_c
0   FTCH  48.11  48.11
1   METC   4.01   4.01

它也非常快,虽然没有什么比使用本地/原始字典更好的了

【讨论】:

【参考方案2】:

如果data 是问题中的字典:

df = pd.DataFrame(
    [
        
            "Ticker": t["ticker"],
            "day_c": t["day"]["c"],
            "min_c": t["min"]["c"],
        
        for t in data["tickers"]
    ]
)
print(df)

打印:

  Ticker  day_c  min_c
0   FTCH  48.11  48.11
1   METC   4.01   4.01

【讨论】:

这是最快的方法(供以后参考)【参考方案3】:

json_normalizedf.joindf.pop 一起使用

对于早期版本:

out  = pd.DataFrame(a)
out = out.join(pd.io.json.json_normalize(out.pop('tickers')))

最新版本:

out  = pd.DataFrame(a)
out = out.join(pd.json_normalize(out.pop('tickers')))

输出:

   count   status ticker  todaysChange  todaysChangePerc              updated  \
0  10465  DELAYED   FTCH          0.21             0.439  1619195306417034752   
1  10465  DELAYED   METC         -0.02            -0.496  1619195280000000000   

   day.c  day.h  day.l  day.o  ...  min.l  min.o  min.v   min.vw  prevDay.c  \
0  48.11  49.61  48.11  48.36  ...  48.11  48.19   8842  48.1468      47.83   
1   4.01   4.09   4.01   4.03  ...   4.01   4.01    100   4.0100       4.03   

   prevDay.h  prevDay.l prevDay.o prevDay.v  prevDay.vw  
0      49.54      47.07     47.90   4938809     48.3369  
1       4.07       4.01      4.05     39628      4.0380  

【讨论】:

这个答案可能是最正确的,但 Andrej 的答案明显更快(0.03s vs. 1.2s) @helloimgeorgia 是的,因为这会解压整个字典 :) @anky,为什么不只是json_normalize(a, 'tickers').filter(['ticker', 'day.c', 'min.c']) @sammywemmy 谢谢。是的,这将根据 OP 进行过滤。在编辑问题并询问特定键之前,我已经发布了完整的解决方案。因此,我保留了我的答案。在这种情况下,Andrej 的回答要好得多。

以上是关于字典中的字典到熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框中的字典列

如何将字典附加到熊猫数据框?

如何从字典列表中提取数据到熊猫数据框中?

在(一个非常大的)熊猫数据框中定位值并存储到字典中

字典中的字典到熊猫数据框

从熊猫数据框中提取嵌套字典