Python - Group by en python

 
Vista:

Group by en python

Publicado por Xavier Mir Rincon (2 intervenciones) el 22/01/2018 09:50:33
Buenas,

estoy intentado hacer un group by con python, de l asiguiente forma:

1
for keyEPI, valueEPI in itertools.groupby(valueNHC, key=itemgetter('campo_1','campo_2'))


El problema que tendo qes que quiero pasar los nombres de los campos como una variable, pero cuando pongo esos dos valores en una variable el error que me da es el siguiente:

unhashable type: 'list'


Como puedo solucionarlo?

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Group by en python

Publicado por kip (257 intervenciones) el 22/01/2018 21:44:52
Hola, no se termina de entender lo que estas intentado hacer, podrías colocar mas código para ponernos mas en contexto ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Group by en python

Publicado por Xavier Mir Rincon (2 intervenciones) el 23/01/2018 09:18:10
Hola,

Lo que intento hacer es a partir de un fichero convertirlo a nested mediante agrupaciones. El fichero de origen es este:

{"nhc":123,"episodio":444,"fechaini_episodio":"2017/07/12","tx":222,"descr_tipotx":"Exploracion general","obx":11,"descr_obx":"Acantosis","valor_obx":"S"}
{"nhc":123,"episodio":62146,"fechaini_episodio":"2014/09/22","tx":666,"descr_tipotx":"Exploracion general","obx":32,"descr_obx":"IMC","valor_obx":"45.85"}
{"nhc":123,"episodio":62146,"fechaini_episodio":"2014/09/22","tx":666,"descr_tipotx":"Exploracion general","obx":3887,"descr_obx":"Hemoglobina","valor_obx":"S"}
{"nhc":4444444,"episodio":3233,"fechaini_episodio":"2011/10/22","tx":223351,"descr_tipotx":"Otras","obx":55,"descr_obx":"Fumador","valor_obx":"S"}

Y tengo que construir esto:

{"nhc" : 123,episodios:[ {"codigo_episodio" : 444, "fechaini_episodio" : 2017/07/12, tx:[{"codigo_tx" : 222, "descr_tipotx" : Exploracion general,obx:[{"codigo_obx" : 11, "descr_obx" : Acantosis, "valor_obx" : S}]}]},{"codigo_episodio" : 62146, "fechaini_episodio" : 2014/09/22, tx:[{"codigo_tx" : 666, "descr_tipotx" : Exploracion general,obx:[{"codigo_obx" : 32, "descr_obx" : IMC, "valor_obx" : 45.85}{"codigo_obx" : 3887, "descr_obx" : Hemoglobina, "valor_obx" : S}]}]}]}

{"nhc" : 4444444,episodios:[ {"codigo_episodio" : 3233, "fechaini_episodio" : 2011/10/22, tx:[{"codigo_tx" : 223351, "descr_tipotx" : Otras,obx:[{"codigo_obx" : 55, "descr_obx" : Fumador, "valor_obx" : S}]}]}]}


Para generar esto lo estoy haciendo con este código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import boto3
import json
import itertools
from operator import itemgetter
from boto3.dynamodb.conditions import Key, Attr
from itertools import groupby
 
def del_none(d):
    for key, value in list(d.items):
        if value is None or value =='':
            del d[key]
        return d
 
def lambda_handler(event, context):
    s32 = boto3.client('s3')
    metadatos_s32 = s32.get_object(
            Bucket='aws-glue-xavi',
            Key= 'prueba_nested.json'
        )
    items=metadatos_s32['Body'].read().decode('latin_1').splitlines()
    agro=[]
    conteo_nhc=len(items)
    for row in items:
        pe=json.loads(row)
        agro.append(pe)
    pacients = sorted(agro, key=itemgetter('nhc'))
 
    JsonPacient = ''
    hola=''
 
    for keyNHC, valueNHC in itertools.groupby(pacients, key=itemgetter('nhc')):
        nhc ='{"nhc" : '+ str(keyNHC) + ',episodios:[ '
        #print(nhc)
        JsonPacient+=nhc
 
        for keyEPI, valueEPI in itertools.groupby(valueNHC, key=itemgetter('episodio','fechaini_episodio')):
            codigo_episodio=keyEPI[0]
            fechaini_episodio=keyEPI[1]
            epi= '{"codigo_episodio" : ' + str(codigo_episodio) +  ',\t "fechaini_episodio" : ' + str(fechaini_episodio) +', tx:['
            #print(epi)
            JsonPacient+=epi
 
            for keyTX, valueTX in itertools.groupby(valueEPI, key=itemgetter('tx','descr_tipotx')):
                codigo_tx=keyTX[0]
                descr_tipotx=keyTX[1]
                tx= '{"codigo_tx" : ' + str(codigo_tx) +  ',\t "descr_tipotx" : ' + str(descr_tipotx) + ',obx:['
                #print(tx)
                JsonPacient+=tx
 
                conteo_obx=0
                for keyOBX, valueOBX in itertools.groupby(valueTX, key=itemgetter('obx','descr_obx','valor_obx')):
                    codigo_obx=keyOBX[0]
                    descr_obx=keyOBX[1]
                    valor_obx=keyOBX[2]
                    obx='{"codigo_obx" : ' + str(codigo_obx) +  ',\t "descr_obx" : ' + str(descr_obx) +  ',\t "valor_obx" : ' + str(valor_obx) + '}'
                    #print(obx)
                    JsonPacient+=obx
 
                JsonPacient += ']},'#Cierro OBX
            JsonPacient = JsonPacient[:-1]
            JsonPacient += ']},'#Cierro TX
        JsonPacient = JsonPacient[:-1]
        JsonPacient += ']} \n'#Cierro EPI
 
    print (JsonPacient)



El problema es que quiero poder pasar los campos del itemgetter() como variable...eso significa que la variable tiene que contener la lista de campos..pero cuando le paso la variable me dice que no encuentra el campo y no lo interpreta bien.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar