字典中的字典到熊猫数据框
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_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
【讨论】:
这个答案可能是最正确的,但 Andrej 的答案明显更快(0.03s vs. 1.2s) @helloimgeorgia 是的,因为这会解压整个字典 :) @anky,为什么不只是json_normalize(a, 'tickers').filter(['ticker', 'day.c', 'min.c'])
@sammywemmy 谢谢。是的,这将根据 OP 进行过滤。在编辑问题并询问特定键之前,我已经发布了完整的解决方案。因此,我保留了我的答案。在这种情况下,Andrej 的回答要好得多。以上是关于字典中的字典到熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章