从熊猫数据框创建嵌套的JSON

时间:2020-09-02 20:56:34

标签: python json pandas nested

Year    temp    Name        DateTime
1950    0       De Bilt     010100
1951    1       De Bilt     010100
1950    2       De Bilt     010101
1951    3       De Bilt     010101
1950    0       Arcen       010100
1951    1       Arcen       010100

我有此数据框(df_stations),并想以以下格式从其中创建JSON:

{
  "De Bilt": {
    "010100": {
      "1950": {
        "temp": 0
      },
      "1951": {
        "temp": 1
      }
    },
    "010101": {
      "1950": {
        "temp": 2
      },
      "1951": {
        "temp": 3
      }
    }
  },
  "Arcen": {
    "010100": {
      "1950": {
        "temp": 0
      },
      "1951": {
        "temp": 1
      }
    },
...

但是,以下代码没有给我正确的结果:

def f(x):
    return (dict({k:v for k,v in zip(x.DateTime,x.Year)},**{'temp':x.temp.iloc[0]}))
(
    df_stations.groupby(['Name','DateTime','Year'])
      .apply(f)
      .groupby(level=0)
      .apply(lambda x: x.tolist())
      .to_dict()
)

有人可以帮我吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

让我们尝试双重分组方式:

{k: {v:d.set_index('Year').to_dict('i') for v,d in g.drop('DateTime',axis=1).groupby(g['DateTime'])}
     for k,g in df.drop('Name',axis=1).groupby(df['Name'])
}

输出:

{'Arcen':   {10100: {1950: {'temp': 0}, 1951: {'temp': 1}}},
 'De Bilt': {10100: {1950: {'temp': 0}, 1951: {'temp': 1}},
             10101: {1950: {'temp': 2}, 1951: {'temp': 3}}
            }
}

但是,我确实认为由于数据嵌套过多,这不是最好的JSON形式。

答案 1 :(得分:0)

def f(x):
    return {level1: {level2: b.xs(level1).xs(level2).to_dict() for level2 in b.xs(level1).index.levels[0] if level2 in b.xs(level1).index.get_level_values(0)} for level1 in b.index.levels[0]}

df_stations.groupby(['Name','DateTime','Year']).apply(f)[0]

将为您提供结果

{'Arcen': {'010100': {1950: {'temp': 0}, 1951: {'temp': 1}}},
 'De Bilt': {'010100': {1950: {'temp': 0}, 1951: {'temp': 1}},
  '010101': {1950: {'temp': 2}, 1951: {'temp': 3}}}}