Estoy tratando de crear un DataFrame de pandas para recopilar todo lo que tengo, pero tengo dificultades para combinar matrices numpy en una lista para crear una matriz única.

Supongamos que tengo los siguientes datos:

df0 = pd.DataFrame([[1,2],[2,2],[3,1],[4,4],[5,4]], columns = ['A','B'])

switch = [[1,3,4],[2,5]]

collect = []
for lists in switch:
    mask = df0.A.isin(lists)
    avg = df0[mask].mean().round(2)
    collect.append(avg)
    collect.append((avg[0]**2+avg[1]+2).round(2))

Esto produce el siguiente resultado:

[A    2.67
 B    2.33
 dtype: float64,
 11.46,
 A    3.5
 B    3.0
 dtype: float64,
 17.25]

Sin embargo, quiero el siguiente resultado:

 A     B      C
2.67  2.33  11.46
3.5   3.0   17.25

Pero no puedo crear una matriz de 2x3 porque len (collect) es 4. Creo que no estoy usando .append de la manera correcta en el ciclo for. ¿Cómo creo una matriz (o una lista) de modo que len (collect) sea 2 o 6? Estoy pensando que si es de longitud 2, simplemente podemos transponer recolectar o si es de longitud 6, podemos remodelarlo.

0
NewbieAF 24 jun. 2020 a las 07:03

2 respuestas

Mi enfoque:

(df0.groupby(pd.Series({x-1:k for k,v in enumerate(switch) for x in v}))
    .mean()
    .assign(C=lambda x: x['A']**2 + x['B']+2)
    .round(2)
)

Salida:

      A     B      C
0  2.67  2.33  11.44
1  3.50  3.00  17.25
0
Quang Hoang 24 jun. 2020 a las 04:14

Otra solución está aquí

import pandas as pd
df0 = pd.DataFrame([[1,2],[2,2],[3,1],[4,4],[5,4]], columns = ['A','B'])

switch = [[1,3,4],[2,5]]

collect = []
def calc(first,second):
   cal=((first**2+second+2).round(2))
return cal

for lists in switch:
   mask = df0.A.isin(lists)
   avg = df0[mask].mean().round(2)
   collect.append(avg)

df=pd.DataFrame(collect)
df['c']='None'
for i in range(2) : 
   list=[df.apply(lambda row : calc(df.loc[i, "A"], df.loc[i, "B"]),axis=1) ]
   df['c'][i]=list[0][i]


print(df)

Salida

    A   B   c
0   2.67    2.33    11.46
1   3.50    3.00    17.25
0
NAGA RAJ S 24 jun. 2020 a las 04:55