Tengo un marco de datos de pandas que tiene un índice múltiple de Mes, luego Día, y luego una sola columna de valores de datos, se parece a esto:

      Data
1 1     6
  2     10
  3     11
  4     12
  5     50
   ...
12 1    3
   2    4
   3    10
   4    11

Tú entiendes. He agrupado el mes y la fecha. Quiero hacer una nueva columna que formatee el mes-fecha juntos. Pero parece que no puedo entenderlo. La salida deseada se vería así:

M-D Data 
1-01 6
1-02 10
1-03 11
1-04 14
1-05 50

¿Alguien puede ofrecer una solución óptima para esto? Nota: Creé el índice anteriormente usando el siguiente código, ¿tal vez necesito regresar y hacer una reestructuración? Lo convertí en un índice múltiple para poder encontrar los valores min (). Las columnas originales 'Mes' y 'Día' tenían Meses y Días en un lapso de 10 años y solo necesitaba el mínimo de esos 10 años, por lo tanto, groupby ().

dframe['Date'] = pd.to_datetime(dframe['Date'])
dframe['Month'], dframe['Day'] = dframe['Date'].dt.month, 
dframe['Date'].dt.day
finaldf = dframe.groupby(['Month','Day'])['Data_Value'].min()
df = pd.DataFrame(finaldf)

¡Gracias de antemano!

1
Silent-J 29 oct. 2017 a las 07:23

3 respuestas

La mejor respuesta

Si necesita formatear el mes y el día como m-d, entonces no separarlos del principio es un enfoque más razonable, por ejemplo, puede formatear la columna Fecha como {{X1} }, agrupa por esta variable y haz las agregaciones que necesitas:

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()

Un breve ejemplo :

dframe = pd.DataFrame({
    'Date': ['2017-08-01', '2016-08-01', '2017-08-02'],
    'Data_Value': [2,3,4]
})

dframe.groupby(pd.to_datetime(dframe['Date']).dt.strftime('%m-%d'))['Data_Value'].min()

#Date
#08-01    2
#08-02    4
#Name: Data_Value, dtype: int64
3
Psidom 29 oct. 2017 a las 04:39

Tomaría el consejo de @ Psidom. Sin embargo, para resolver la pregunta que se hizo:
Yo usaría format

df.assign(**{'M-D': df.index.map('{0[0]}-{0[1]}'.format).rename('M-D')})

      Data   M-D
1  1     6   1-1
   2    10   1-2
   3    11   1-3
   4    12   1-4
   5    50   1-5
12 1     3  12-1
   2     4  12-2
   3    10  12-3
   4    11  12-4

Configuración

df = pd.DataFrame(dict(
    Data=[6, 10, 11, 12, 50, 3, 4, 10, 11],
), [[1] * 5 + [12] * 4, list(range(1, 6)) + list(range(1, 5))])
2
piRSquared 29 oct. 2017 a las 05:18

Es un poco complicado trabajar con multiIndex, no estoy seguro de que sea muy eficiente en el tiempo, pero funciona:

df["M-D"] = [str(df.index[i][0])+'-'+str(df.index[i][1]) for i in range(len(df))]

Da el siguiente resultado:

In[143]: df.head()
Out[143]: 
           Open New_date
Month Day               
1     1    9597      1-1
      2    9370      1-2
      3    9365      1-3
      4    9766      1-4
      5    9446      1-5
0
Erlinska 29 oct. 2017 a las 04:44