【问题标题】:Read a multi nested Dictionary value into column in Pandas将多嵌套字典值读入 Pandas 的列
【发布时间】:2020-07-11 02:34:57
【问题描述】:

我有一些硬件可以将数据输出为嵌套字典。

data_out = {'unimportant_dict': [{'dateTime': '2019-12-01', 'value': '183'}], 'secondary_dict': {'sub_dict': [{'time': '00:00:00', 'value': 0}, {'time': '00:01:00', 'value': 0}, {'time': '00:02:00', 'value': 0}], 'datasetInterval': 1}}

我对“sub_dict”中的“值”数据感兴趣,我想将其读入 Pandas df,但我有多个文件要整理成一个数据帧。

我可以读取一个可以正常工作的文件

tempdict = data_out['secondary_dict']
testdf = pd.DataFrame(tempdict['sub_dict'])

这给了

       time        value
     0  00:00:00      0
     1  00:01:00      0
     2  00:02:00      0
     3  00:03:00      0
     4  00:04:00      0

现在我想添加第二个文件,但只添加值数据(因为时间戳总是相同的)。假设第二个文件具有与上述相同的结构,我的方法是错误的。

tempdict2 = data_out2['secondary_dict']['value']   
testdf['new data'] = tempdict2
TypeError: list indices must be integers or slices, not str

我认为这是因为它是一个很长的字典列表(我假设它是一个保留时间顺序的列表)。我以为我可以添加它,然后删除额外的时间列,但它将整个字典添加为单个列

          time  value                              fle2
   0  00:00:00      0  {'time': '00:00:00', 'value': 0}
   1  00:01:00      0  {'time': '00:01:00', 'value': 0}
   2  00:02:00      0  {'time': '00:02:00', 'value': 0}
   3  00:03:00      0  {'time': '00:03:00', 'value': 0}
   4  00:04:00      0  {'time': '00:04:00', 'value': 0}

在我写作时,我想知道将“值”值提取到列表中然后将其添加到 df 是否更容易?

我认为这不是 Capture python value from multi-nested dictionary 因为这仍然是一个列表作为单个字典,而这是一个列表中有很多字典。

任何帮助表示赞赏。

【问题讨论】:

  • 你介意看看你分享的数据,某处有错误。另外,您能否分享第二个文件的小样本,以便根据您的要求工作的人可以获得完整的图片。也发布最终输出 df。
  • 抱歉 - 我在文件数据中不清楚。该数据有大约 1400 个条目,所以我截断了(我试图用 ... 表示,但鉴于这是一个编码站点,这是一个坏主意。已更新。

标签: python python-3.x pandas dictionary


【解决方案1】:

首先,将所有数据读入名为all_nested_dicts 的列表中。我假设您在所有文件中都有相同数量的记录,并且所有文件的 time 值都相同。如果没有这两个假设,下面的解决方案将不起作用,因为我只是通过连接它们来合并数据帧。

dfs = []
for i, nested_dict in enumerate(all_nested_dicts):
    df = pd.DataFrame(nested_dict['secondary_dict']['sub_dict']).rename(columns = {'value': f'value_{i}'})
    df.sort_values("time", inplace = True)
    # drop the `time` column from all subsequent files after sorting
    if i >= 1:
        df.drop("time", axis = 1, inplace = True)
    dfs.append(df)

final_df = pd.concat(dfs, axis = 1)

【讨论】:

  • 谢谢 - 这工作。我实际上有很多文件而不是示例中的 2 个,因此在此基础上定义了一个简单的函数。
猜你喜欢
  • 2022-08-15
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2021-09-25
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多