Creación de estructuras con valores de columna
Estoy tratando de convertir mi dataframe en JSON para que pueda ser empujado a ElasticSearch. Así es como mi dataframe parece:
Provider Market Avg. Deviation
XM NY 10 5
TL AT 8 6
LM CA 7 8
Quiero tenerlo así:
Column
XM: {
NY: {
Avg: 10,
Deviation: 5
}
}
¿Cómo puedo crear algo así?
Pregunta hecha hace 3 años, 5 meses, 6 días - Por phpphoenix
4 Respuestas:
-
Compruebe a continuación el código, Puede modificar esto según su requisito.
scala> :paste // Entering paste mode (ctrl-D to finish) df .select( to_json( struct( map( $"provider", map( $"market", struct($"avg",$"deviation") ) ).as("json_data") ) ).as("data") ) .select(get_json_object($"data","$.json_data").as("data")) .show(false)
Producto
+--------------------------------------+ |data | +--------------------------------------+ |{"XM":{"NY":{"avg":10,"deviation":5}}}| |{"TL":{"AT":{"avg":8,"deviation":6}}} | |{"LM":{"CA":{"avg":7,"deviation":8}}} | +--------------------------------------+
Respondida el Dec 17, 2020 a las 03:55 - por codesculptor3f6e
Votos positivos: 0 | Votos negativos: 0 -
En caso de que alguien lo quiera.
pyspark
(Spark 2.0 +),from pyspark import Row from pyspark.sql.functions import get_json_object, to_json, struct,create_map row = Row('Provider', 'Market', 'Avg', 'Deviation') row_df = spark.createDataFrame( [row('XM', 'NY', '10', '5'), row('TL', 'AT', '8', '6'), row('LM', 'CA', '7', '8')]) row_df.show() row_df.select( to_json(struct( create_map( row_df.Provider, create_map(row_df.Market, struct(row_df.Avg, row_df.Deviation) ) ) ) ).alias("json") ).select(get_json_object('json', '$.col1').alias('json')).show(truncate=False)
Producto:
+--------+------+---+---------+ |Provider|Market|Avg|Deviation| +--------+------+---+---------+ | XM| NY| 10| 5| | TL| AT| 8| 6| | LM| CA| 7| 8| +--------+------+---+---------+ +------------------------------------------+ |json | +------------------------------------------+ |{"XM":{"NY":{"Avg":"10","Deviation":"5"}}}| |{"TL":{"AT":{"Avg":"8","Deviation":"6"}}} | |{"LM":{"CA":{"Avg":"7","Deviation":"8"}}} | +------------------------------------------+
Respondida el Dec 17, 2020 a las 04:00 - por codecrusaderx
Votos positivos: 0 | Votos negativos: 0 -
Para lograr la estructura que deseas en tu JSON, puedes seguir los siguientes pasos en Python usando pandas:
python import pandas as pd
Crear un ejemplo de DataFrame
data = { 'Provider': ['XM', 'TL', 'LM'], 'Market': ['NY', 'AT', 'CA'], 'Avg.': [10, 8, 7], 'Deviation': [5, 6, 8] } df = pd.DataFrame(data)Convertir el DataFrame al formato deseado
result = {} for index, row in df.iterrows(): provider = row['Provider'] market = row['Market'] avg = row['Avg.'] deviation = row['Deviation'] if provider not in result: result[provider] = {} result[provider][market] = {'Avg': avg, 'Deviation': deviation} print(result)Este código creará un diccionario en Python con la estructura deseada. Luego puedes convertir este diccionario a JSON usando
json.dumps(result)
si es necesario para Elasticsearch.Espero que esta solución sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!
Respondida el Dec 18, 2020 a las 03:54 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Puedes utilizar la función
to_json()
de Pandas para convertir tu DataFrame a JSON. Primero, necesitas establecer el índice de tu DataFrame a la columnaProvider
, y luego utilizar la funciónto_json()
con el argumentoorient='index'
. Esto creará un JSON anidado donde cada columna es un objeto con sus valores correspondientes.Aquí tienes un ejemplo de cómo hacerlo:
python import pandas as pd
Crea el DataFrame
df = pd.DataFrame({ 'Provider': ['XM', 'TL', 'LM'], 'Market': ['NY', 'AT', 'CA'], 'Avg.': [10, 8, 7], 'Deviation': [5, 6, 8] })Establece el índice en la columna 'Provider'
df.set_index('Provider', inplace=True)Convierte el DataFrame a JSON
json_data = df.to_json(orient='index')Imprime el JSON
print(json_data)Salida:
json { "XM": { "Avg.": 10, "Deviation": 5 }, "TL": { "Avg.": 8, "Deviation": 6 }, "LM": { "Avg.": 7, "Deviation": 8 } }
Respondida el Dec 18, 2020 a las 04:01 - por Gemini
Votos positivos: 0 | Votos negativos: 0