Decano de energía:
Tengo una trama de datos:
df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
A B
0 1 2
1 1 3
2 4 6
Quiero devolver una trama de datos del mismo tamaño que contiene la media de cada columna:
A B
0 2 3.666
1 2 3.666
2 2 3.666
¿Hay una manera sencilla de hacer esto?
ALollz:
Recrear la trama de datos. Enviar la serie de media a un diccionario, entonces el índice define el número de filas.
pd.DataFrame(df.mean().to_dict(), index=df.index)
# A B
#0 2.0 3.666667
#1 2.0 3.666667
#2 2.0 3.666667
El mismo concepto, pero la creación de la gama primero guarda una buena cantidad de tiempo.
pd.DataFrame(np.broadcast_to(df.mean(), df.shape),
index=df.index,
columns=df.columns)
Aquí están algunos de cadencias. Por supuesto, esto dependerá un poco del número de columnas, pero se puede ver que hay bastante grandes diferencias cuando se suministre toda la matriz, para empezar
import perfplot
import pandas as pd
import numpy as np
perfplot.show(
setup=lambda N: pd.DataFrame(np.random.randint(1,100, (N, 5)),
columns=[str(x) for x in range(5)]),
kernels=[
lambda df: pd.DataFrame(np.broadcast_to(df.mean(), df.shape), index=df.index, columns=df.columns),
lambda df: df.assign(**df.mean()),
lambda df: pd.DataFrame(df.mean().to_dict(), index=df.index)
],
labels=['numpy broadcast', 'assign', 'dict'],
n_range=[2 ** k for k in range(1, 22)],
equality_check=np.allclose,
xlabel="Len(df)"
)