He estado tratando de normalize una muy anidada archivo json lo haré más adelante analizar. Lo que estoy luchando con la es cómo ir más de un nivel de profundidad a normalizar.

Me fui a través de la los pandas.io.json.json_normalize documentación, ya que hace exactamente lo que yo quiero hacer.

He sido capaz de normalizar parte de ella y ahora entiendo cómo los diccionarios de trabajo, pero todavía no estoy allí.

Con el código de abajo, yo soy capaz de obtener sólo el primer nivel.

import json
import pandas as pd
from pandas.io.json import json_normalize

with open('authors_sample.json') as f:
    d = json.load(f)

raw = json_normalize(d['hits']['hits'])

authors = json_normalize(data = d['hits']['hits'], 
                         record_path = '_source', 
                         meta = ['_id', ['_source', 'journal'], ['_source', 'title'], 
                                 ['_source', 'normalized_venue_name']
                                 ])

Estoy tratando de ‘dig’ en el ‘autores’ diccionario con el código de abajo, pero la record_path = ['_source', 'authors'] me lanza TypeError: string indices must be integers. Como tengo entendido json_normalize la lógica debe ser bueno, pero yo todavía no entiendo muy bien cómo sumergirse en un json con dict vs list.

Incluso fui a través de este simple ejemplo.

authors = json_normalize(data = d['hits']['hits'], 
                         record_path = ['_source', 'authors'], 
                         meta = ['_id', ['_source', 'journal'], ['_source', 'title'], 
                                 ['_source', 'normalized_venue_name']
                                 ])

A continuación es un fragmento del archivo json (5 registros).

{u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
u'hits': {u'hits': [{u'_id': u'7CB3F2AD',
u'_index': u'scibase_listings',
u'_score': 1.0,
u'_source': {u'authors': None,
u'deleted': 0,
u'description': None,
u'doi': u'',
u'is_valid': 1,
u'issue': None,
u'journal': u'Physical Review Letters',
u'link': None,
u'meta_description': None,
u'meta_keywords': None,
u'normalized_venue_name': u'phys rev lett',
u'pages': None,
u'parent_keywords': [u'Chromatography',
u'Quantum mechanics',
u'Particle physics',
u'Quantum field theory',
u'Analytical chemistry',
u'Quantum chromodynamics',
u'Physics',
u'Mass spectrometry',
u'Chemistry'],
u'pub_date': u'1987-03-02 00:00:00',
u'pubtype': None,
u'rating_avg_weighted': 0,
u'rating_clarity': 0.0,
u'rating_clarity_weighted': 0.0,
u'rating_innovation': 0.0,
u'rating_innovation_weighted': 0.0,
u'rating_num_weighted': 0,
u'rating_reproducability': 0,
u'rating_reproducibility_weighted': 0.0,
u'rating_versatility': 0.0,
u'rating_versatility_weighted': 0.0,
u'review_count': 0,
u'tag': [u'mass spectra', u'elementary particles', u'bound states'],
u'title': u'Evidence for a new meson: A quasinuclear NN-bar bound state',
u'userAvg': 0.0,
u'user_id': None,
u'venue_name': u'Physical Review Letters',
u'views_count': 0,
u'volume': None},
u'_type': u'listing'},
{u'_id': u'7AF8EBC3',
u'_index': u'scibase_listings',
u'_score': 1.0,
u'_source': {u'authors': [{u'affiliations': [u'Punjabi University'],
u'author_id': u'780E3459',
u'author_name': u'munish puri'},
{u'affiliations': [u'Punjabi University'],
u'author_id': u'48D92C79',
u'author_name': u'rajesh dhaliwal'},
{u'affiliations': [u'Punjabi University'],
u'author_id': u'7D9BD37C',
u'author_name': u'r s singh'}],
u'deleted': 0,
u'description': None,
u'doi': u'',
u'is_valid': 1,
u'issue': None,
u'journal': u'Journal of Industrial Microbiology & Biotechnology',
u'link': None,
u'meta_description': None,
u'meta_keywords': None,
u'normalized_venue_name': u'j ind microbiol biotechnol',
u'pages': None,
u'parent_keywords': [u'Nuclear medicine',
u'Psychology',
u'Hydrology',
u'Chromatography',
u'X-ray crystallography',
u'Nuclear fusion',
u'Medicine',
u'Fluid dynamics',
u'Thermodynamics',
u'Physics',
u'Gas chromatography',
u'Radiobiology',
u'Engineering',
u'Organic chemistry',
u'High-performance liquid chromatography',
u'Chemistry',
u'Organic synthesis',
u'Psychotherapist'],
u'pub_date': u'2008-04-04 00:00:00',
u'pubtype': None,
u'rating_avg_weighted': 0,
u'rating_clarity': 0.0,
u'rating_clarity_weighted': 0.0,
u'rating_innovation': 0.0,
u'rating_innovation_weighted': 0.0,
u'rating_num_weighted': 0,
u'rating_reproducability': 0,
u'rating_reproducibility_weighted': 0.0,
u'rating_versatility': 0.0,
u'rating_versatility_weighted': 0.0,
u'review_count': 0,
u'tag': [u'flow rate',
u'operant conditioning',
u'packed bed reactor',
u'immobilized enzyme',
u'specific activity'],
u'title': u'Development of a stable continuous flow immobilized enzyme reactor for the hydrolysis of inulin',
u'userAvg': 0.0,
u'user_id': None,
u'venue_name': u'Journal of Industrial Microbiology & Biotechnology',
u'views_count': 0,
u'volume': None},
u'_type': u'listing'},
{u'_id': u'7521A721',
u'_index': u'scibase_listings',
u'_score': 1.0,
u'_source': {u'authors': [{u'author_id': u'7FF872BC',
u'author_name': u'barbara eileen ryan'}],
u'deleted': 0,
u'description': None,
u'doi': u'',
u'is_valid': 1,
u'issue': None,
u'journal': u'The American Historical Review',
u'link': None,
u'meta_description': None,
u'meta_keywords': None,
u'normalized_venue_name': u'american historical review',
u'pages': None,
u'parent_keywords': [u'Social science',
u'Politics',
u'Sociology',
u'Law'],
u'pub_date': u'1992-01-01 00:00:00',
u'pubtype': None,
u'rating_avg_weighted': 0,
u'rating_clarity': 0.0,
u'rating_clarity_weighted': 0.0,
u'rating_innovation': 0.0,
u'rating_innovation_weighted': 0.0,
u'rating_num_weighted': 0,
u'rating_reproducability': 0,
u'rating_reproducibility_weighted': 0.0,
u'rating_versatility': 0.0,
u'rating_versatility_weighted': 0.0,
u'review_count': 0,
u'tag': [u'social movements'],
u'title': u"Feminism and the women's movement : dynamics of change in social movement ideology, and activism",
u'userAvg': 0.0,
u'user_id': None,
u'venue_name': u'The American Historical Review',
u'views_count': 0,
u'volume': None},
u'_type': u'listing'},
{u'_id': u'7DAEB9A4',
u'_index': u'scibase_listings',
u'_score': 1.0,
u'_source': {u'authors': [{u'author_id': u'0299B8E9',
u'author_name': u'fraser j harbutt'}],
u'deleted': 0,
u'description': None,
u'doi': u'',
u'is_valid': 1,
u'issue': None,
u'journal': u'The American Historical Review',
u'link': None,
u'meta_description': None,
u'meta_keywords': None,
u'normalized_venue_name': u'american historical review',
u'pages': None,
u'parent_keywords': [u'Superconductivity',
u'Nuclear fusion',
u'Geology',
u'Chemistry',
u'Metallurgy'],
u'pub_date': u'1988-01-01 00:00:00',
u'pubtype': None,
u'rating_avg_weighted': 0,
u'rating_clarity': 0.0,
u'rating_clarity_weighted': 0.0,
u'rating_innovation': 0.0,
u'rating_innovation_weighted': 0.0,
u'rating_num_weighted': 0,
u'rating_reproducability': 0,
u'rating_reproducibility_weighted': 0.0,
u'rating_versatility': 0.0,
u'rating_versatility_weighted': 0.0,
u'review_count': 0,
u'tag': [u'iron'],
u'title': u'The iron curtain : Churchill, America, and the origins of the Cold War',
u'userAvg': 0.0,
u'user_id': None,
u'venue_name': u'The American Historical Review',
u'views_count': 0,
u'volume': None},
u'_type': u'listing'},
{u'_id': u'7B3236C5',
u'_index': u'scibase_listings',
u'_score': 1.0,
u'_source': {u'authors': [{u'author_id': u'7DAB7B72',
u'author_name': u'richard m freeland'}],
u'deleted': 0,
u'description': None,
u'doi': u'',
u'is_valid': 1,
u'issue': None,
u'journal': u'The American Historical Review',
u'link': None,
u'meta_description': None,
u'meta_keywords': None,
u'normalized_venue_name': u'american historical review',
u'pages': None,
u'parent_keywords': [u'Political Science', u'Economics'],
u'pub_date': u'1985-01-01 00:00:00',
u'pubtype': None,
u'rating_avg_weighted': 0,
u'rating_clarity': 0.0,
u'rating_clarity_weighted': 0.0,
u'rating_innovation': 0.0,
u'rating_innovation_weighted': 0.0,
u'rating_num_weighted': 0,
u'rating_reproducability': 0,
u'rating_reproducibility_weighted': 0.0,
u'rating_versatility': 0.0,
u'rating_versatility_weighted': 0.0,
u'review_count': 0,
u'tag': [u'foreign policy'],
u'title': u'The Truman Doctrine and the origins of McCarthyism : foreign policy, domestic politics, and internal security, 1946-1948',
u'userAvg': 0.0,
u'user_id': None,
u'venue_name': u'The American Historical Review',
u'views_count': 0,
u'volume': None},
u'_type': u'listing'}],
u'max_score': 1.0,
u'total': 36429433},
u'timed_out': False,
u'took': 170}
  • ¿A solucionar el problema? La misma pregunta tengo error: TypeError: object of type 'NoneType' has no len().

2 Comentarios

  1. 16

    De los pandas ejemplo (continuación) ¿qué hacen los corchetes significan? Hay una lógica a seguir para ir más profundo con la [].

    Cada elemento en el ['state', 'shortname', ['info', 'governor']] es una ruta de acceso a un elemento a incluir, en adición a las filas seleccionadas. El 'counties' argumento lo filas debe ser producido, y que el segundo argumento añade metadatos que será incluido en las filas.

    Cada uno es el camino, una lista es una estructura anidada. En el ejemplo de la salida que ver los valores correspondientes en la state, shortname y info.governor columnas.

    En su ejemplo, JSON, hay pocas listas anidadas para elevar con el primer argumento, como 'counties' hizo en el ejemplo. El único ejemplo en que discbased es el anidada 'authors' clave; tendrías que extraer cada ['_source', 'authors'] camino, después de lo cual usted puede agregar otras teclas del objeto primario para aumentar las filas:

    >>> json_normalize(raw, [['_source', 'authors']], ['_id', ['_source', 'journal'], ['_source', 'title']])
    affiliations author_id          author_name       _id  \
    0                              NaN  166468F4  a bowdoin van riper  7FDFEB02
    1                              NaN  81070854   jeffrey h schwartz  7FDFEB02
    2  [Pennsylvania State University]  7E15BDFA       roger l geiger  7538108B
    _source.journal  \
    0  The American Historical Review
    1  The American Historical Review
    2  The American Historical Review
    _source.title
    0  Men Among the Mammoths: Victorian Science and ...
    1  Men Among the Mammoths: Victorian Science and ...
    2  Elizabeth Popp Berman. Creating the Market Uni...

    Así que este es un dataframe de los autores, con el agregado de los metadatos para cada autor (_id valor, nombre de la revista y el título del artículo).

    Nota la ruta de acceso para el primer argumento; si desea de la lista anidada ruta de acceso que usted necesita para proporcionar una lista de rutas (incluso si es sólo un camino); sólo ['_source', 'authors'] sería para dos fila de fuentes, cada una simple nivel superior nombre.

    El segundo argumento, a continuación, tira de la _id clave de la ultraperiféricas objeto, pero el título y el nombre de la revista se list caminos, ya que estos están anidados demasiado.

    • Gracias!. Creo que con su ejemplo me entiende cómo se ‘unwrangles’. Si no me equivoco, ‘fuente’ se destrabó y de identificación y tipo de ser igualada. Permítanme bucear en ella. Eres el mejor! Pero ese código me da este error: TypeError: objeto de tipo ‘NoneType’ no tiene len(). Yo no se tu misma salida.
    • es una combinación interna en las filas de la fuente y una tabla de columnas adicionales.
    • Por fin he descubierto el primer argumento correctamente y actualizado en consecuencia; esto me dio la oportunidad de aumentar los metadatos ejemplo con el _id clave.
    • Sabes qué? Nunca me molesté en mirar en esto mucho. Este ha sido esclarecedor.
    • Gracias por la corrección! Y es un tema interesante. No sé por qué no podía encontrar más en el MODO en el tema. Más y más tengo que hacer análisis con datos json en estos días.
    • Extraño ahora estoy recibiendo el error: TypeError: objeto de tipo ‘NoneType’ no tiene len()
    • eso no es algo que me he encontrado; el código en mi respuesta no tirarlo al menos.
    • Yo lo probé en otra máquina en una notebbok y trabaja perfectamente. Necesito saber lo que está pasando con mi equipo y mi actual distribución de python.
    • Esta es una vieja cuestión, pero me encontré con el problema con esta solución. con raw = d['hits']['hits'] y d como el dado anidada diccionario a la pregunta original, la solución da error TypeError: object of type 'NoneType' has no len().
    • Con este error persistente, también he publicado similar json análisis de la pregunta stackoverflow.com/questions/54209963/…

  2. 2

    También puede echar un vistazo a la biblioteca flatten_json, que no requiere que usted para escribir la columna de jerarquías como en json_normalize:

    from flatten_json import flatten
    data = d['hits']['hits']
    dict_flattened = (flatten(record, '.') for record in data)
    df = pd.DataFrame(dict_flattened)
    print(df)

    Ver https://github.com/amirziai/flatten.

Dejar respuesta

Please enter your comment!
Please enter your name here