У меня есть датафрейм, как показано ниже
name address.office.street address.office.city address.office.country address.office.postcode location.tracker.id
0 Name1 Street1 City1 Country1 100 9,99,02,129
1 Name2 Street2 City2 Country2 200 1,91,95,129
2 Name3 Street3 City3 Country3 300 99,90,259
Я разделил столбец и создал MultiIndex, как показано ниже
idx = df.columns.str.split('.', expand=True)
df.columns = idx
df[('location', 'tracker', 'id')] = df[('location', 'tracker', 'id')].str.split(',')
print(df)
name address location
NaN office tracker
NaN street city country postcode id
0 Name1 Street1 City1 Country1 100 [9, 99, 02, 129]
1 Name2 Street2 City2 Country2 200 [1, 91, 95, 129]
2 Name3 Street3 City3 Country3 300 [99, 90, 259]
Я хочу преобразовать это во вложенный json. Могу ли я узнать, как Панды преобразовать это в ниже JSON.
[{
"имя": "Имя1",
"адрес": {
"офис": {
"улица": "улица1",
"city": "City1",
"страна": "Страна1",
"почтовый индекс": 100
}
},
"место нахождения": {
"трекер": {
"Я бы": [
"9",
"99",
"02",
"129"
]
}
}}, {
"имя": "Имя2",
"адрес": {
"офис": {
"улица": "улица2",
"city": "City2",
"страна": "Страна2",
"почтовый индекс": 200
}
},
"место нахождения": {
"трекер": {
"Я бы": [
"1",
"91",
"95",
"129"
]
}
}}, {
"name": "Name3",
"адрес": {
"офис": {
"улица": "улица3",
"city": "City3",
"страна": "Страна3",
"почтовый индекс": 300
}
},
"место нахождения": {
"трекер": {
"Я бы": [
"99",
"90",
"259"
]
}
}}]
Хотя я могу получить вышеуказанный результат с помощью приведенного ниже кода, он становится медленным, когда количество записей (df.shape [0]) велико.
nested_dict = lambda: defaultdict(nested_dict)
result = nested_dict()
result_list = []
for cntr in range(df.shape[0]):
for i, j in df.iteritems():
value = j[cntr]
if not pd.isnull(i[2]):
result[i[0]][i[1]][i[2]] = value
elif not pd.isnull(i[1]):
result[i[0]][i[1]] = value
elif not pd.isnull(i[0]):
result[i[0]] = value
result_list.append(deepcopy(result))
print(json.dumps(result_list, indent=4))
Я смотрю, чтобы упростить это похоже на
(df.groupby(level=['level0']).apply(lambda df: df.xs(df.name))).to_json()
Но не удалось получить результаты, как ожидалось.