【问题标题】:Python Pandas Create Records from Complex DictionaryPython Pandas 从复杂字典创建记录
【发布时间】:2017-01-02 08:34:24
【问题描述】:

我处理了一些非常复杂的嵌套json对象,得到如下通用字典格式:

{'key1':'value1',
 'key2':'value2',
 'key3':'value3',
 'key4':'value4',
 'key5':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']],
 'key6':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']]}

在列表列表中,每个列表都表示应该是“个人交易”等价物。每个事务共享 key1、key2、key3、key4 对。可以有任意数量的列表。我正在尝试有效地将这些转换为 pandas 数据框中的记录,如下所示:

 key1_field, key2_field, key3_field, key4_field, key5_or_key6_field_1, key5_or_key6_field_2, key5_or_key6_field_3, key5_or_key6_indicator 
     value1,     value2,     value3,    value 4,               value5,               value6,               value7,                   key5
     value1,     value2,     value3,    value 4,               value5,               value6,               value7,                   key6                
     value1,     value2,     value3,    value 4,               value8,               value9,              value10,                   key5 
     value1,     value2,     value3,    value 4,               value8,               value9,              value10,                   key6

任何帮助将不胜感激!做到这一点已经足够挑战了。谢谢!

编辑:

按照要求,我可以发布我一直在尝试解决此问题的方法:

import pandas as pd
import numpy as np

d = {'key1':'value1',
     'key2':'value2',
     'key3':'value3',
     'key4':'value4',
     'key5':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']],
     'key6':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']]}

df = pd.DataFrame({k : pd.Series(v) for k, v in d.iteritems()})

我剩下的问题是第一行之后的单个键值是 NaN。

【问题讨论】:

  • @Merlin 当然。明白。我已经尝试了一些使用 dict.iteritems 和列表推导来解决这个问题的选项,但似乎陷入了僵局。任何有关如何剖析问题的建议表示赞赏。
  • @Merlin 我已经用迄今为止我所能得到的最接近的更新了这个。谢谢,约翰

标签: python json pandas dictionary


【解决方案1】:

一种选择是按原样读取字典并重塑数据框:

df = pd.DataFrame({'key1':'value1',
 'key2':'value2',
 'key3':'value3',
 'key4':'value4',
 'key5':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']],
 'key6':[['value5', 'value6', 'value7'], ['value8', 'value9', 'value10']]})

df.set_index(['key1', 'key2', 'key3', 'key4']).stack().apply(pd.Series) \
  .rename(columns = lambda x: "value_" + str(x)).reset_index()

#     key1    key2    key3    key4  level_4 value_0 value_1 value_2
# 0 value1  value2  value3  value4  key5    value5  value6  value7
# 1 value1  value2  value3  value4  key6    value5  value6  value7
# 2 value1  value2  value3  value4  key5    value8  value9  value10
# 3 value1  value2  value3  value4  key6    value8  value9  value10

【讨论】:

  • 哇,这真的很简洁。不幸的是,如果我最初只是尝试将字典读入数据帧,则会收到“ValueError: arrays must be all the length”。
  • 您是否尝试准确读取您在问题中显示的数据集,或者您有不同的数据集?
  • 是的,您的选项确实适用于模拟数据集。不过,列表列表中可以有任意数量的列表。我只是用 2 作为例子。
  • 如果您愿意再看一看,我已经更新了这个。谢谢
  • 更新数据和原始数据有什么区别?
【解决方案2】:

试试这个:

pd.DataFrame({k : pd.Series(v) for k, v in d.iteritems()}).ffill()

【讨论】:

  • 感谢 .ffill() 添加!我可以从这里拿走。
猜你喜欢
  • 2017-05-08
  • 2015-10-29
  • 2021-04-18
  • 2020-01-22
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2019-02-10
  • 2020-07-22
相关资源
最近更新 更多