i have a json file contains :
my expected resulted is to have comments and replies together in same row
[
{
"comments_full": [
{
"comment_id": "10158615203365493",
"comment_url": "https://facebook.com/10158615203365493",
"commenter_id": "100000738385184",
"commenter_url": "https://facebook.com/karencelli1978?fref=nf&rc=p&refid=52&__tn__=R",
"commenter_name": "Karen Celli Gonin",
"commenter_meta": null,
"comment_text": "Johnny, une institution, un pilier, un beau cadeau \ud83d\udc9e",
"comment_time": 1637139809000,
"comment_image": "https://bytl.fr/DiagBbox?fbclid=IwAR1R7gYF4UcFAx1PmTMQSsjAU6uE2ktufl9MkeGfFXHjMbEgSVFzuLWu0Kk",
"comment_reactors": [],
"comment_reactions": null,
"comment_reaction_count": null,
"replies": [
{
"comment_id": "10158637221900493",
"comment_url": "https://facebook.com/10158637221900493",
"commenter_id": "94533530492",
"commenter_url": "https://facebook.com/bouyguestelecom/?rc=p&refid=52&__tn__=~RR",
"commenter_name": "Bouygues Telecom",
"commenter_meta": "Author",
"comment_text": "Bonjour, Mille excuses pour cet incident. Avez-vous essay\u00e9 ce diagnostic ? https://\nbytl.fr/DiagBbox\nVotre Assistant Bbox (disponible 7j/7) vous accompagne dans 100% des cas vers une solution adapt\u00e9e et personnalis\u00e9e. Une fois termin\u00e9 et si besoin, une mise en relation avec un sp\u00e9cialiste ou Internet Garanti (recharge sur votre ligne mobile si vous \u00eates client mobile ou une Cl\u00e9 4G si vous \u00eates uniquement client box) vous sera propos\u00e9e.\nPetit conseil : nous vous recommandons d\u2019\u00eatre connect\u00e9 en 4G avec votre t\u00e9l\u00e9phone mobile et d\u2019\u00eatre \u00e0 proximit\u00e9 de vos \u00e9quipements, des manipulations seront s\u00fbrement n\u00e9cessaires durant le diagnostic \ud83d\ude09\nMerci pour votre patience,\nGwladys, Conseill\u00e8re Bouygues Telecom",
"comment_time": 1637971200000,
"comment_image": "https://bytl.fr/DiagBbox?fbclid=IwAR1R7gYF4UcFAx1PmTMQSsjAU6uE2ktufl9MkeGfFXHjMbEgSVFzuLWu0Kk",
"comment_reactors": [],
"comment_reactions": null,
"comment_reaction_count": null
}, {
"comment_id": "387128923196835",
"comment_url": "https://facebook.com/387128923196835",
"commenter_id": "1603185710",
"commenter_url": "https://facebook.com/ju.cecchi?fref=nf&rc=p&refid=52&__tn__=R",
"commenter_name": "Ju Cecchi",
"commenter_meta": null,
"comment_text": "Chargez vous de r\u00e9soudre nos soucis de r\u00e9seau impossible d'acc\u00e9der \u00e0 nos t\u00e9l\u00e9phone en 4G incroyable ! Pour encaiss\u00e9 l'abonnement ya pas de soucis la !",
"comment_time": null,
"comment_image": "https://bytl.fr/MeteoDuReseau?fbclid=IwAR0i3VrTiHJp27OIjahy0J2D1tOSCJX5iC9_bMEk1BZ4F-s82hSDyNrz18A",
"comment_reactors": [],
"comment_reactions": null,
"comment_reaction_count": null,
"replies": [
{
"comment_id": "387132053196522",
"comment_url": "https://facebook.com/387132053196522",
"commenter_id": "94533530492",
"commenter_url": "https://facebook.com/bouyguestelecom/?rc=p&refid=52&__tn__=~RR",
"commenter_name": "Bouygues Telecom",
"commenter_meta": null,
"comment_text": "Bonjour,\n\nNous sommes vraiment d\u00e9sol\u00e9s pour cet incident.\n\nSi vous avez d\u00e9j\u00e0 red\u00e9marr\u00e9 votre mobile et que le souci persiste, vous pouvez :\n1. Voir si une panne a \u00e9t\u00e9 identifi\u00e9e et suivre sa r\u00e9solution : https://\nbytl.fr/\nMeteoDuReseau\n2. Couper la 4G temporairement sur votre smartphone pour rester en 2G/3G : cette manipulation vous permettra de conserver les appels et SMS en cas d\u2019incident r\u00e9seau 4G,\n3. Activer le VoWiFi dans les param\u00e8tres de votre t\u00e9l\u00e9phone (compatible avec les iPhone, Samsung Galaxy r\u00e9cent, Huawei, Sony Xperia ou Honor). Vous pourrez ainsi passer des appels depuis votre smartphone d\u00e8s lors que vous \u00eates connect\u00e9 en Wi-Fi. Pour en savoir plus sur le VoWi-Fi, c'est juste l\u00e0 : https://\nbytl.fr/VoWiFi\n\nEnfin, dans la majorit\u00e9 des cas, les incidents r\u00e9seau sont r\u00e9solus dans les 24 heures. Si cela persiste malgr\u00e9 tout, nous sommes disponibles au 1064 apr\u00e8s avoir dit \"J'ai un probl\u00e8me r\u00e9seau\".\n\n\u00c0 bient\u00f4t,\n\u00c9milie, conseill\u00e8re Bouygues Telecom",
"comment_time": null,
"comment_image": "https://bytl.fr/MeteoDuReseau?fbclid=IwAR0i3VrTiHJp27OIjahy0J2D1tOSCJX5iC9_bMEk1BZ4F-s82hSDyNrz18A",
"comment_reactors": [],
"comment_reactions": null,
"comment_reaction_count": null
},
{
"comment_id": "387240859852308",
"comment_url": "https://facebook.com/387240859852308",
"commenter_id": "100001879469164",
"commenter_url": "https://facebook.com/bruno.venditti.1?fref=nf&rc=p&__tn__=R",
"commenter_name": "Bruno Venditti Altobelli",
"commenter_meta": null,
"comment_text": "4G Bouygues entre 3 et 15 selon les heures et pas de 4G \n4G Orange entre 35 et 210 selon les heures.\nJ'ai toujours un abonnement secondaire chez vous.",
"comment_time": null,
"comment_image": null,
"comment_reactors": [],
"comment_reactions": null,
"comment_reaction_count": null
}
]
}
]
}
]
when i use :
with open('f1.json') as f:
d = json.load(f)
file = pd.json_normalize(d, record_path=['comments_full'])
f = file.to_csv('file.csv')
i get the comments_full with all the columns but replies are still nested :
,comment_id,comment_url,commenter_id,commenter_url,commenter_name,commenter_meta,comment_text,comment_time,comment_image,comment_reactors,comment_reactions,comment_reaction_count,replies
when i try to add another normalize like this :
with open('f1.json') as f:
d = json.load(f)
file = pd.json_normalize(d, record_path=['comments_full'])
file2= pd.json_normalize(file,record_path=['replies'])
file2.to_csv('file.csv')
i get the error :
result = result[spec]
TypeError: string indices must be integers
the full json here
i hope someone can help me thank you.
CodePudding user response:
Try:
json_normalize
on "comments_full"explode
the replies column to get one reply per rowjson_normalize
on "replies" andadd_prefix
to differentiate from comments columnsjoin
to get the output
comments = pd.json_normalize(d, record_path='comments_full')
comments = comments.explode("replies").reset_index(drop=True)
replies = pd.json_normalize(comments["replies"].tolist()).add_prefix("reply.")
output = comments.join(replies)