Как составить список словарей из панды DataFrame? - PullRequest
3 голосов
/ 14 апреля 2019

Я пытаюсь настроить список с определенными словарями. Мне бы хотелось, чтобы структура была похожа на следующую:

[{'label': 'Abdelnaby, Alaa', 'value': '76001'},
{'label': 'Abdul-Aziz, Zaid', 'value': '76002'},
{'label': 'Abdul-Jabbar, Kareem', 'value': '76003'}]

В настоящее время данные, из которых я извлекаю данные, находятся в кадре данных pandas. Пример ниже ...

PlayerID    Name     Current Player First Season    Last Season
76001   Abdelnaby, Alaa       0     1990            1994
76002   Abdul-Aziz, Zaid      0     1968            1977
76003   Abdul-Jabbar, Kareem  0     1969            1988
51      Abdul-Rauf, Mahmoud   0     1990            2000
1505    Abdul-Wahad, Tariq    0     1997            2003

Пожалуйста, дайте мне знать, если этого достаточно. Большое спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 14 апреля 2019

Выберите ваши столбцы, переименуйте их и позвоните to_dict с помощью orient='records', чтобы получить список диктов,

(df.reindex(['Name', 'PlayerID'], axis=1)
   .set_axis(['label', 'value'], axis=1, inplace=False)
   .to_dict('r'))    

# [{'label': 'Abdelnaby, Alaa', 'value': 76001},
#  {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
#  {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
#  {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
#  {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]

Вы можете вывести JSON, изменив .to_dict('r') на .to_json(orient='records').


Если производительность имеет значение, вот оптимизированное решение с построением понимания списка.

[dict(zip(('label', 'value'), r)) for r in df[['Name', 'PlayerID']].values]

# [{'label': 'Abdelnaby, Alaa', 'value': 76001},
#  {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
#  {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
#  {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
#  {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]
2 голосов
/ 14 апреля 2019

Если скорость - проблема, мы можем использовать dict comp:

myjson = [{'label': name, 'value': pid} for pid,name in zip(df['PlayerID'], df['Name'])]

Дает:

[{'label': 'Abdelnaby, Alaa', 'value': 76001},
 {'label': 'Abdul-Aziz, Zaid', 'value': 76002},
 {'label': 'Abdul-Jabbar, Kareem', 'value': 76003},
 {'label': 'Abdul-Rauf, Mahmoud', 'value': 51},
 {'label': 'Abdul-Wahad, Tariq', 'value': 1505}]

Далее, если вы хотите записать данные как json :

import json
with open('myjson.json','w') as fo:
    json.dump(myjson,fo,indent=4)

Сравнение скорости

%%timeit
myjson = [{'label': name, 'value': pid} for pid,name in zip(df['PlayerID'].values, df['Name'].values)]

5.9 µs ± 125 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)



%%timeit
myjson = (df.reindex(['Name', 'PlayerID'], axis=1)
   .set_axis(['label', 'value'], axis=1, inplace=False)
   .to_dict('record')
)
756 µs ± 24.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 14 апреля 2019

Имя игрока Текущий игрок Первый сезон Последний сезон 76001 Abdelnaby, Alaa 0 1990 1994 76002 Абдул-Азиз, Заид 0 1968 1977 76003 Абдул-Джаббар, Карим 0 1969 1988 51 Абдул-Рауф, Махмуд 0 1990 2000 1505 Абдул-Вахад, Тарик 0 1997 2003

#You already have a data frame 
dataframe="your data frame"
#us iloc 
values=dataframe.iloc[:,0]# u have all rows n 0th col
label=dataframe.iloc[:,1] #u have all rows n 1st col
dic={}

    for i,val in values:
         dic[val]=lable[i]

#hope the logic is clear.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...