从数据帧创建嵌套的JSON

2024-09-29 22:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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_站),并想用它创建一个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()
)

有人能帮我吗?非常感谢


Tags: 数据代码namejsondfdatetime格式de
2条回答

让我们试试双重分组:

{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格式,因为嵌套数据太多

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}}}}

相关问题 更多 >

    热门问题