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()
)
有人可以帮我吗?非常感谢!
答案 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}}}}