Créer un DataFrame Pandas à partir de JSON profondément imbriqué
Je suis en train de créer un seul Pandas DataFrame objet à partir d'une profondément imbriqués chaîne JSON.
Le JSON schéma est:
{"intervals": [
{
pivots: "Jane Smith",
"series": [
{
"interval_id": 0,
"p_value": 1
},
{
"interval_id": 1,
"p_value": 1.1162791357932633e-8
},
{
"interval_id": 2,
"p_value": 0.0000028675012051504467
}
],
},
{
"pivots": "Bob Smith",
"series": [
{
"interval_id": 0,
"p_value": 1
},
{
"interval_id": 1,
"p_value": 1.1162791357932633e-8
},
{
"interval_id": 2,
"p_value": 0.0000028675012051504467
}
]
}
]
}
Résultat souhaité j'ai besoin d'aplatir cette à produire un tableau:
Actor Interval_id Interval_id Interval_id ...
Jane Smith 1 1.1162 0.00000 ...
Bob Smith 1 1.1162 0.00000 ...
La première colonne est la Pivots
valeurs, et les autres colonnes sont les valeurs des clés interval_id
et p_value
stockées dans la liste series
.
Jusqu'à présent, j'ai
import requests as r
import pandas as pd
actor_data = r.get("url/to/data").json['data']['intervals']
df = pd.DataFrame(actor_data)
actor_data
est une liste où la longueur est égale au nombre d'individus ie pivots.values()
. Le df de l'objet renvoie simplement
<bound method DataFrame.describe of pivots Series
0 Jane Smith [{u'p_value': 1.0, u'interval_id': 0}, {u'p_va...
1 Bob Smith [{u'p_value': 1.0, u'interval_id': 0}, {u'p_va...
.
.
.
Comment puis-je parcourir que series
liste pour obtenir le dict de valeurs et de créer des N colonnes distinctes? Devrais-je essayer de créer un DataFrame pour la series
liste, à revoir,et puis faire une colonne lier avec l'acteur noms?
Mise à JOUR:
pvalue_list = [i['p_value'] for i in json_data['series']]
cela me donne une liste de listes. Maintenant, j'ai besoin de comprendre comment ajouter chaque liste comme une ligne dans un DataFrame.
value_list = []
for i in pvalue_list:
pvs = [j['p_value'] for j in i]
value_list = value_list.append(pvs)
return value_list
Cela renvoie une NoneType
Solution
def get_hypthesis_data():
raw_data = r.get("/url/to/data").json()['data']
actor_dict = {}
for actor_series in raw_data['intervals']:
actor = actor_series['pivots']
p_values = []
for interval in actor_series['series']:
p_values.append(interval['p_value'])
actor_dict[actor] = p_values
return pd.DataFrame(actor_dict).T
Ceci renvoie à la bonne DataFrame. J'ai transposé-il si les individus ont été les lignes et pas de colonnes.
source d'informationauteur idclark
Vous devez vous connecter pour publier un commentaire.
Je pense que l'organisation de vos données de façon à ce que les rendements de répéter les noms de colonne va seulement créer des maux de tête pour vous plus tard sur la route. Une meilleure approche à mon humble avis est de créer une colonne pour chacune des
pivots
interval_id
etp_value
. Cela va rendre extrêmement facile à interroger vos données après le chargement dans les pandas.Aussi, votre JSON contient des erreurs. J'ai couru à travers cette pour trouver les erreurs.
jq
aide iciCela donnera des résultats semblables à
Adapté de ce commentaire
Bien sûr, vous pouvez toujours faire appel à
res.drop_duplicates()
pour supprimer les lignes en double. Cela donne