Cómo obtener el número de índice de cada mes como una nueva columna [cerrada]

Tengo un conjunto de datos con columna de fecha y columna de valor. El conjunto de datos es similar a esto:

df=
datecreated     valuename
2019-08-01        QA
2019-08-02        BS
2019-08-14        BV
2019-08-30        QT
2019-07-04        QA
2019-07-09        QA
2019-07-11        QT
2019-07-17        BV
2019-07-29        QA

df schema= datecreated: timestamp 
           valuename: string

Estoy tratando de conseguir una salida similar a esto:

Month         month_count    QA_count BS_count BV_count QT_count B
2019-07         0                    3         0        1          1
2019-08         1                    1         1        1          1

Ya he conseguido todas las columnas excepto la columna de mes_cuento... Me gustaría tener un número de índice basado en mi columna de mes.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por htmlhelix


3 Respuestas:

  • Grupo de uso Por y los métodos de pivote de Pyspark:

    import pyspark.sql.functions as F
    
    df2 = df.groupBy(F.date_format('datecreated', 'yyyy-MM').alias('month')
                    ).pivot('valuename').count().fillna(0)
    
    df2.show()
    +-------+---+---+---+---+
    |  month| BS| BV| QA| QT|
    +-------+---+---+---+---+
    |2019-07|  0|  1|  3|  1|
    |2019-08|  1|  1|  1|  1|
    +-------+---+---+---+---+
    
    df3 = df.groupBy(F.date_format('datecreated', 'yyyy-MM').alias('month')).pivot('valuename').count().fillna(0).withColumn('month_count', F.row_number().over(Window.orderBy('month')) - 1)
    df3.show()
    +-------+---+---+---+---+-----------+
    |  month| BS| BV| QA| QT|month_count|
    +-------+---+---+---+---+-----------+
    |2019-07|  0|  1|  3|  1|          0|
    |2019-08|  1|  1|  1|  1|          1|
    +-------+---+---+---+---+-----------+
    

    Respondida el Dec 18, 2020 a las 14:23 - por pixelpioneerb898

    Votos positivos: 0 | Votos negativos: 0

  • El código en Python para agregar una nueva columna "month_count" que contiene el número de índice para cada mes en el conjunto de datos sería el siguiente:

    python
    import pandas as pd
    
    

    Crear un DataFrame de ejemplo

    data = {'datecreated': ['2019-08-01', '2019-08-02', '2019-08-14', '2019-08-30', '2019-07-04', '2019-07-09', '2019-07-11', '2019-07-17', '2019-07-29'], 'valuename': ['QA', 'BS', 'BV', 'QT', 'QA', 'QA', 'QT', 'BV', 'QA']} df = pd.DataFrame(data)

    Convertir la columna 'datecreated' a tipo datetime

    df['datecreated'] = pd.to_datetime(df['datecreated'])

    Extraer el año y mes de cada fecha

    df['Month'] = df['datecreated'].dt.to_period('M')

    Crear la columna 'month_count' que contiene el número de índice para cada mes

    df['month_count'] = df.groupby('Month').cumcount()

    Mostrar el resultado

    output = df.pivot_table(index='Month', columns='valuename', values='month_count', aggfunc='count', fill_value=0) output.reset_index(inplace=True) print(output)

    Este código primero convierte la columna 'datecreated' a tipo datetime, luego extrae el año y el mes de cada fecha. Posteriormente, crea la columna 'month_count' que contiene el número de índice para cada mes usando el método cumcount(). Finalmente, utiliza pivot_table para reorganizar los datos y contar la ocurrencia de cada valor en la columna 'valuename' para cada mes.

    Respondida el Dec 19, 2020 a las 14:27 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • ```python import pandas as pd

    Crear un diccionario para mapear los nombres de los meses a sus números de índice

    month_map = { 'Enero': 1, 'Febrero': 2, 'Marzo': 3, 'Abril': 4, 'Mayo': 5, 'Junio': 6, 'Julio': 7, 'Agosto': 8, 'Septiembre': 9, 'Octubre': 10, 'Noviembre': 11, 'Diciembre': 12 }

    Extraer el mes como una nueva columna, usando el método dt.month_name()

    df['Month'] = df['datecreated'].dt.month_name()

    Mapear los nombres de los meses a sus números de índice

    df['monthcount'] = df['Month'].map(monthmap)

    Agrupar el DataFrame por el mes y contar el número de valores distintos en cada columna

    result = df.groupby('Month').agg({ 'QA': 'nunique', 'BS': 'nunique', 'BV': 'nunique', 'QT': 'nunique' })

    Restablecer el índice para tener una columna separada para el número de mes

    result = result.reset_index()

    Imprimir el resultado

    print(result) ```

    Respondida el Dec 19, 2020 a las 14:36 - por Gemini

    Votos positivos: 0 | Votos negativos: 0