#python #json #dataframe #web-scraping #telethon
#python #json #фрейм данных #веб-очистка #телемарафон
Вопрос:
Это часть файла json, который я получил в качестве выходных данных после запуска скрипта python с использованием telethon API.
[{"_": "Message", "id": 4589, "to_id": {"_": "PeerChannel", "channel_id": 1399858792}, "date": "2020-09-03T14:51:03 00:00", "message": "Looking for product managers / engineers who have worked in search engine / query understanding space. Please PM me if you can connect me to someone for the same", "out": false, "mentioned": false, "media_unread": false, "silent": false, "post": false, "from_scheduled": false, "legacy": false, "edit_hide": false, "from_id": 356886523, "fwd_from": null, "via_bot_id": null, "reply_to_msg_id": null, "media": null, "reply_markup": null, "entities": [], "views": null, "edit_date": null, "post_author": null, "grouped_id": null, "restriction_reason": []}, {"_": "MessageService", "id": 4588, "to_id": {"_": "PeerChannel", "channel_id": 1399858792}, "date": "2020-09-03T11:48:18 00:00", "action": {"_": "MessageActionChatJoinedByLink", "inviter_id": 310378430}, "out": false, "mentioned": false, "media_unread": false, "silent": false, "post": false, "legacy": false, "from_id": 1264437394, "reply_to_msg_id": null}
Как вы можете видеть, скрипт python удалил чаты из определенного канала в telegram. Все, что мне нужно, это сохранить раздел даты и сообщения json в отдельном фрейме данных, чтобы я мог применить соответствующие фильтры и выдать правильный вывод. Кто-нибудь может мне помочь с этим?
Ответ №1:
- Предполагается, что объект, возвращаемый из API, не является строкой (например
'[{...}, {...}]'
.- Если это строка, сначала используйте
data = json.loads(data)
.
- Если это строка, сначала используйте
'date'
И соответствующие'message'
могут быть извлечены изlist
ofdicts
с помощью понимания списка.- Выполните итерацию по каждому из
dict
вlist
и используйтеdict.get
дляkey
. Если ключ не существует,None
возвращается.
import pandas as pd
# where data is the list of dicts, unpack the desired keys and load into pandas
df = pd.DataFrame([{'date': i.get('date'), 'message': i.get('message')} for i in data])
# display(df)
date message
0 2020-09-03T14:51:03 00:00 Looking for product managers / engineers who have worked in search engine / query understanding space. Please PM me if you can connect me to someone for the same
1 2020-09-03T11:48:18 00:00 None
В качестве альтернативы
- Если вы хотите пропустить данные, где
'message'
находитсяNone
df = pd.DataFrame([{'date': i['date'], 'message': i['message']} for i in data if i.get('message')])
date message
2020-09-03T14:51:03 00:00 Looking for product managers / engineers who have worked in search engine / query understanding space. Please PM me if you can connect me to someone for the same
Ответ №2:
Я думаю, вам следует использовать json loads, а затем json_normalize для преобразования json в фрейм данных с max_level для вложенного словаря.
from pandas import json_normalize
import json
d = '[{"_": "Message", "id": 4589, "to_id": {"_": "PeerChannel", "channel_id": 1399858792}, "date": "2020-09-03T14:51:03 00:00", "message": "Looking for product managers / engineers who have worked in search engine / query understanding space. Please PM me if you can connect me to someone for the same", "out": false, "mentioned": false, "media_unread": false, "silent": false, "post": false, "from_scheduled": false, "legacy": false, "edit_hide": false, "from_id": 356886523, "fwd_from": null, "via_bot_id": null, "reply_to_msg_id": null, "media": null, "reply_markup": null, "entities": [], "views": null, "edit_date": null, "post_author": null, "grouped_id": null, "restriction_reason": []}, {"_": "MessageService", "id": 4588, "to_id": {"_": "PeerChannel", "channel_id": 1399858792}, "date": "2020-09-03T11:48:18 00:00", "action": {"_": "MessageActionChatJoinedByLink", "inviter_id": 310378430}, "out": false, "mentioned": false, "media_unread": false, "silent": false, "post": false, "legacy": false, "from_id": 1264437394, "reply_to_msg_id": null}]'
f = json.loads(d)
print(json_normalize(f, max_level=2))