【发布时间】:2019-06-29 11:04:09
【问题描述】:
我有一个结构如下的 DataFrame。 (这是 JSON 规范化的结果)
mydf
id colA colB ... colArray
foo a1 b1 [{'date': '...', 'data1': '...', 'data2': 0.1 ...}, ...]
bar a2 b2 [{'date': '...', 'data1': '...', 'data2': 0.1 ...}, ...]
fooz a3 b3 [{'date': '...', 'data1': '...', 'data2': 0.1 ...}, ...]
barz a4 b4 [{'date': '...', 'data1': '...', 'data2': 0.1 ...}, ...]
-
date是时间戳 -
colArray行中的每个数组都有不同的长度,但具有完全相同的数组元素结构 -
['id', 'colA', 'colB']是我想用作唯一索引的列示例
我想转换这些数据,以便将它们用作时间序列。 我想要的输出是这样的:
id colA colB ... date data1 data2 ... data n
foo a1 b1 '1st timestamp' 'flex' 0.1
foo a1 b1 '...'
...
foo a1 b1 'last_timestamp'
bar a2 b2 '1st timestamp' 'zorg'
bar a2 b2 '...'
...
bar a2 b2 'last_timestamp'
fooz a3 b3 '...'
fooz a3 b3 '...'
...
fooz a3 b3 '...'
etc.
这将允许我根据 [foo, a1, b1] 等元组绘制/分析时间序列
对我来说,这看起来与Flatten nested pandas dataframe 非常相似,但接受的答案令人沮丧:JSON/dict 数据并未真正处理以生成具有正确数据的 DataFrame。
有人对如何实现这一点有任何建议吗?
第一种方法
使用以下,接近我想要的:
tmpdf = pd.DataFrame(mydf['colArray'].tolist())
json_normalize(tmpdf[0])
但是有两个问题:
- 我丢失了我想用作唯一标识符的
['id', 'colA', 'colB']元组。 - 我需要对我的 tmpdf 的每一行执行操作
第二种方法
基于Accessing nested JSON data as dataframes in Pandas
pd.concat(pd.DataFrame.from_dict(tmp_array) for array in mydf['colArray'])
它给了我一个数据框,其中我的所有数组都被展平,列名正确,但我丢失了相应的键 (['id', 'colA', 'colB'])。
我觉得这是正确的方法,但我不知道如何保留索引列(以便我可以通过索引列过滤每个结果时间序列)。
可惜没有“json_melt”功能
第三种方法
基于这个问题Flatten nested pandas dataframe。 我可以保留我的索引列,但数组元素仍然在 JSON 中并且索引为 [0, 1, 2, ...]。我将无法处理可变长度(列索引的较高值有很多 NA
参考书目: Create a Pandas DataFrame from deeply nested JSON 但是解决方案是基于原始的 JSON 处理,而我想在现有的 DataFrame 上这样做
Accessing nested JSON data as dataframes in Pandas这和我想要的很接近。
Flatten nested pandas dataframe 结果看起来像是我的第一次尝试,但底层 JSON 数据并没有真正“矩阵化”到数据帧中。
A rather complex and not satisfaying approach
编辑:This question is the same 但在询问时,我无法通过搜索找到它。供日后参考?
【问题讨论】:
标签: python json pandas normalization