我想我正在从 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
答案 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_normalize
与 df.join
和 df.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
它也非常快,虽然没有什么比使用原生/原始字典更好