【问题标题】:multi index json to data frame多索引json到数据框
【发布时间】:2020-06-23 02:03:47
【问题描述】:

我正在读取文本文件并使用 python defaukt dict 形成 json 来创建数据框,最后创建 parquet 文件。 我创建熊猫数据框和 每行都由时间、源、事件和元数据列唯一标识..还有其他字段,如 COL1、COL2..COl100。

我想创建这样的数据框

数据框

Time                       EVENT                      META_DATA        SOURCE COL1 COL2 COL3
20200508051804.8340+0730  event1                       some meta data  source1 10 23

要创建上面的数据框,我需要像下面这样形成 json

  d1={'100': {('event1','source1',"some meta data"): {'COL1': 10, 'COL1': 'some'}}}
    
  df=pd.concat([pd.DataFrame(v).T for v in d1.values()], keys=d1.keys()).rename_axis(index=['Time', 'EVENT','source','meta_data']).reset_index()

它工作正常,但要实现这一点,我需要将这些属性的值保持为元组。 寻找另一种存储方式 就像我可以这样存储

d1={'100': {'source1': {'COL1': 10, 'COL1': 'some', 'COL3': 1.1}}, 'EVENT':'event1', 'meta_data':"some meta data"}

并且仍然能够在 DATAFRAME 之上创建

更新1:
输入:

d1={'100': {'source1': {'COL1': 10, 'COL2': '2.3', 'COL3': 1.1},'source2': {'COL1': 19, 'COL2': '3.4', 'COL4': 0.4}, 'EVENT':'event1', 'meta_data':"some metadata1"},'200': {'source1': {'COL1': 10, 'COL2': '0.55', 'COL4': 1.1},'source2': {'COL1': 11, 'COL4': '5.6', 'COL3': 1.1}, 'EVENT':'event2','meta_data':"some meta data2"},'300': {'source3': {'COL1': 15, 'COL2': '.23', 'COL4': 1.1},'source1': {'COL1': 10, 'COL4': '4.7', 'COL3':1.2}, 'EVENT':'event3', 'meta_data':"some meta data3"}}

输出: 熊猫数据框

 Time EVENT   META_DATA       SOURCE  COL1 COL2   COL3   COL4
100  event1   some meta data1  source1 10    2.3   1.1
100  event1   some meta data1  source2 19    3.4         0.4
200  event2   some meta data2  source1 10    0.55        1.1
200  event2   some meta data2  source2 11          1.1   5.6
300  event2   some meta data3  source3 15    .23         1.1
300  event2   some meta data3  source1 10          1.2   4.7

EVENT 和 META_DATA 是时间明智的,即。在特定时间总是相同的。 例如:时间 100 有 event1 和 meta data 一些 meta data1。
在特定时间可以有多个来源,每个来源可以与一个或多个相关联(字段即 COL1、COl2、....COL100)。每个来源应位于单独的行中。 例如:source1,source 2属于时间100

【问题讨论】:

  • 不确定我是否关注。您是否将 json 作为输入,并且您正在尝试创建数据框 - 反之亦然?具体来说,输入和预期输出是什么?
  • @Roy2012 更新了问题
  • 谢谢。你确定输入和输出是准确的吗?输入包含 EVENT':'some event',而输出是 EVENT - event1。这是故意的吗?
  • @Roy2012 谢谢纠正。
  • 源是否始终称为“source1”?如果没有,您可以添加另一个具有不同源名称的示例吗?你提前知道源名称的集合吗?

标签: python pandas


【解决方案1】:

这里有一个解决方案:

df = pd.DataFrame.from_dict(d1, orient="index").reset_index()
df = df.melt(id_vars = ["EVENT", "meta_data", "index"]).dropna()
df = pd.concat([df, df.value.apply(pd.Series)], axis=1)
df.rename(columns = {"variable": "source"}).drop("value", axis=1)

输出是:

    EVENT        meta_data index   source  COL1  COL2  COL3 COL4
0  event1   some metadata1   100  source1    10   2.3   1.1  NaN
1  event2  some meta data2   200  source1    10  0.55   NaN  1.1
2  event3  some meta data3   300  source1    10   NaN   1.2  4.7
3  event1   some metadata1   100  source2    19   3.4   NaN  0.4
4  event2  some meta data2   200  source2    11   NaN   1.1  5.6
8  event3  some meta data3   300  source3    15   .23   NaN  1.1

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 2019-01-16
    • 2020-10-22
    • 1970-01-01
    • 2020-07-11
    • 2020-04-16
    • 2015-04-19
    • 2018-10-24
    相关资源
    最近更新 更多