es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Resumiendo todos los valores repetidos en un conjunto de datos.

Tengo un conjunto de datos en el que en una columna tengo el nombre de una persona y en otra columna tengo la cantidad que se le pagó por un servicio dado. Me gustaría construir una lista con los nombres de todas las personas ordenadas por la cantidad total que se les pagó independientemente del servicio que realizaron. Ejemplo:

Ann     100
John    200
Matt    150
John    150
John    150
Ann     300
Erik    150

=================

John 500
Ann 400
Matt 150
Erik 150

Entiendo que esto implica buscar todas las instancias repetidas del nombre de la persona y luego almacenar el valor pagado en la columna, sumando todo eventualmente. El problema es que tengo una lista demasiado grande y no puedo verificar los nombres individuales. Es decir, no puedo definir una cadena particular para cada nombre para ser verificado, sino que me gustaría que el programa determinara las instancias repetidas por sí mismo y devolviera la lista ordenada de la manera que describí. ¿Hay alguna manera de hacer esto? Conozco un poco de Python y R, por lo que cualquier método descrito en estos lenguajes sería especialmente útil.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay formas de hacer esto tanto en Python como en R.

    En Python, una posible solución implicaría utilizar un diccionario para realizar un seguimiento del pago total de cada persona. Podemos recorrer cada fila en el conjunto de datos y actualizar el total de pago para la persona correspondiente en el diccionario. Aquí hay un código de muestra:

    data = [
        ['Ann', 100],
        ['John', 200],
        ['Matt', 150],
        ['John', 150],
        ['John', 150],
        ['Ann', 300],
        ['Erik', 150]
    ]
    
    totals = {}  # crear un diccionario vacío para almacenar los pagos totales
    
    for row in data:
        name, payment = row  # extraer el nombre y el pago de la fila actual
    
        if name in totals:
            totals[name] += payment  # si hemos visto a esta persona antes, agregamos el pago a su total
        else:
            totals[name] = payment  # de lo contrario, creamos una nueva entrada de diccionario con el pago como total inicial
    
    # crear una lista de tuplas a partir del diccionario, ordenado en orden descendente por el total de pago
    sorted_totals = sorted(totals.items(), key=lambda x: x[1], reverse=True)
    
    for name, total in sorted_totals:
        print(name, total)
    

    Esto imprimirá la siguiente lista:

    John 500
    Ann 400
    Matt 150
    Erik 150
    

    En R, un enfoque similar implicaría utilizar un data.frame y la función aggregate() para agrupar por la columna name y sumar la columna payment. Aquí hay un código de muestra:

    data <- data.frame(
      name = c('Ann', 'John', 'Matt', 'John', 'John', 'Ann', 'Erik'),
      payment = c(100, 200, 150, 150, 150, 300, 150)
    )
    
    totals <- aggregate(payment ~ name, data, sum)
    
    # ordenar el data.frame por pago en orden descendente
    sorted_totals <- totals[order(totals$payment, decreasing = TRUE), ]
    
    print(sorted_totals)
    

    Esto imprimirá la siguiente lista:

      name payment
    2 John     500
    1  Ann     400
    3 Matt     150
    4 Erik     150
    

    Ambas soluciones deberían poder manejar conjuntos de datos más grandes y agruparse automáticamente por nombre sin necesidad de definir cadenas específicas para cada nombre.

Comments are closed.