Pandas multiindex to json - PullRequest
       29

Pandas multiindex to json

0 голосов
/ 10 ноября 2018

У меня есть датафрейм, как показано ниже

    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()

Но не удалось получить результаты, как ожидалось.

...