我有一个结构如下的数据框。 (这是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]
对我来说,这看起来非常相似展平嵌套的 pandas 数据框 https://stackoverflow.com/questions/38574596/flatten-nested-pandas-dataframe,但接受的答案令人沮丧:JSON/dict 数据并未真正处理以生成具有正确数据的 DataFrame。
有人对如何实现这一目标有任何建议吗?
第一种方法
使用以下内容,这接近我想要的:
tmpdf = pd.DataFrame(mydf['colArray'].tolist())
json_normalize(tmpdf[0])
但有两个问题:
- 我失去了
['id', 'colA', 'colB']
我想用作唯一标识符的元组。
- 我需要对 tmpdf 的每一行执行操作
第二种方法
基于在 Pandas 中将嵌套 JSON 数据作为数据帧访问 https://stackoverflow.com/questions/23208197/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”功能
第三种方法
基于这个问题展平嵌套的 pandas 数据框 https://stackoverflow.com/questions/38574596/flatten-nested-pandas-dataframe。
我可以保留索引列,但数组元素仍为 JSON 格式并索引为 [0, 1, 2, ...]。我在处理可变长度时会遇到麻烦(列索引的较高值有很多 NA
参考书目:从深度嵌套的 JSON 创建 Pandas DataFrame https://stackoverflow.com/questions/21494030/create-a-pandas-dataframe-from-deeply-nested-json但解决方案是基于原始的 JSON 处理,而我想在现有的 DataFrame 上执行此操作
在 Pandas 中将嵌套 JSON 数据作为数据帧访问 https://stackoverflow.com/questions/23208197/accessing-nested-json-data-as-dataframes-in-pandas这非常接近我想要的。
展平嵌套的 pandas 数据框 https://stackoverflow.com/questions/38574596/flatten-nested-pandas-dataframe结果看起来像我的第一次尝试,但底层 JSON 数据并未真正“矩阵”到数据帧中。
一种相当复杂且不令人满意的方法 https://dataideas.blog/2018/10/09/loading-json-it-looks-simple-part-1/
EDIT: 这个问题是一样的 https://stackoverflow.com/questions/49671693/pandas-dataframe-normalize-one-json-column-and-merge-with-other-columns但在询问时,我无法通过搜索找到它。供将来参考?