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

时间:2021-04-23 16:57:53

标签: python pandas list api dictionary

我想我正在从 API 的一个 dict 内的一个列表中接收一个 dict。如何将其转换为 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 

3 个答案:

答案 0 :(得分:4)

如果 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

答案 1 :(得分: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  

答案 2 :(得分: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

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