La aplicación de la función trama de datos, volviendo a cada fila de la trama de datos de base

votos
2

ejemplo de juguete

Supongamos que base_dfes la pequeña trama de datos se muestra a continuación:

In [221]: base_df
Out[221]: 
     seed
I S      
0 a     0
  b     1
1 a     2
  b     3

Tenga en cuenta que base_dftiene un índice de multi-2-nivel para las filas. (Parte del problema aquí consiste en propagar los valores de este índice múltiples en una trama de datos derivados).

Ahora, la función fn(definición dada al final de este post) realiza un número entero seedcomo argumento y devuelve una trama de datos 1-columna indexada por claves de cadena 1 . Por ejemplo:

In [222]: fn(0)
Out[222]: 
              F
key            
01011  0.592845
10100  0.844266

In [223]: fn(1)
Out[223]: 
              F
key            
11110  0.997185
01000  0.932557
11100  0.128124

Quiero generar una nueva trama de datos, en esencia, aplicando fna cada fila de base_df, y la concatenación de las tramas de datos resultantes verticalmente. Más específicamente, el resultado deseado se vería así:

                  F
I S key            
0 a 01011  0.592845
    10100  0.844266
  b 11110  0.997185
    01000  0.932557
    11100  0.128124
1 a 01101  0.185082
    01110  0.931541
  b 00100  0.070725
    11011  0.839949
    11111  0.121329
    11000  0.569311

IOW, conceptualmente, la trama de datos deseado se obtiene mediante la generación de una sub-trama de datos para cada fila de base_df, y la concatenación de estos sub-tramas de datos verticalmente. La sub-trama de datos correspondiente a cada fila tiene un multi-índice de 3 niveles. Los dos primeros niveles ( Iy S) de este multi-índice provienen de base_df's valor multi-índice para esa fila, mientras que su último nivel ( key), así como los valores para la (solitario) Fcolumna provienen de la trama de datos devuelto por fnpara que de la fila seedde valor.

La parte no me queda claro es sobre cómo propagar valor multi-índice original de la fila a las filas de la trama de datos creado por fnpara de esa fila seedde valor.

IMPORTANTE: Estoy buscando una manera de hacer esto que es agnóstico a los nombres de los base_dfniveles 's de varios índices, y su número.


He intentado lo siguiente

base_df.apply(lambda row: fn(row.seed), axis=1)

... pero la evaluación se produce el error

ValueError: Shape of passed values is (4, 2), indices imply (4, 1)

¿Hay alguna manera conveniente de hacer lo que estoy tratando de hacer?


Aquí está la definición de fn. Sus partes internas no son importantes en lo que respecta a esta cuestión. Lo que importa es que toma un entero seedcomo argumento y devuelve una trama de datos, tal como se describe anteriormente.

import numpy
def fn(seed, _spec='{{0:0{0:d}b}}'.format(5)):
    numpy.random.seed(int(seed))
    n = numpy.random.randint(2, 5)
    r = numpy.random.rand(n)
    k = map(_spec.format, numpy.random.randint(0, 31, size=n))
    result = pandas.DataFrame(r, columns=['F'], index=k)
    result.index.name = 'key'
    return result

1 En este ejemplo, estas teclas pasan a corresponder a la representación binaria de un entero entre 0 y 31, ambos inclusive, pero este hecho no juega ningún papel en la cuestión.

Publicado el 01/07/2017 a las 18:31
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
5

Opción 1
groupby

base_df.groupby(level=[0, 1]).apply(fn)

                  F
I S key            
0 a 11010  0.385245
    00010  0.890244
    00101  0.040484
  b 01001  0.569204
    11011  0.802265
    00100  0.063107
1 a 00100  0.947827
    00100  0.056551
    11000  0.084872
  b 11110  0.592641
    00110  0.130423
    11101  0.915945

opcion 2
pd.concat

pd.concat({t.Index: fn(t.seed) for t in base_df.itertuples()})

                  F
    key            
0 a 11011  0.592845
    00011  0.844266
  b 00101  0.997185
    01111  0.932557
    00000  0.128124
1 a 01011  0.185082
    10010  0.931541
  b 10011  0.070725
    01010  0.839949
    01011  0.121329
    11001  0.569311
Respondida el 01/07/2017 a las 19:29
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more