Calculer la moyenne de toutes les x lignes dans une table et créer une nouvelle table
J'ai une longue table de données (~200 lignes par 50 colonnes) et j'ai besoin de créer un code qui peut calculer la moyenne des valeurs de tous les deux lignes et pour chaque colonne dans la table avec la finale de la sortie d'une nouvelle table des valeurs moyennes. C'est évidemment fou de le faire dans Excel! J'utilise python3 et je suis au courant de certaines des questions similaires:ici, ici et ici. Mais aucun de ces aides que j'ai besoin d'un code élégant pour travailler avec plusieurs colonnes et produit organisé une table de données. Par la façon dont mon original datatable a été importé à l'aide de pandas et est définie comme un dataframe, mais ne pouvait pas trouver un moyen facile de le faire dans les pandas. L'aide est très apprécié.
Un exemple de la table (version courte) est:
a b c d
2 50 25 26
4 11 38 44
6 33 16 25
8 37 27 25
10 28 48 32
12 47 35 45
14 8 16 7
16 12 16 30
18 22 39 29
20 9 15 47
Moyenne attendue de la table:
a b c d
3 30.5 31.5 35
7 35 21.5 25
11 37.5 41.5 38.5
15 10 16 18.5
19 15.5 27 38
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une artificielle groupe à l'aide de
df.index//2
(ou @DSM a souligné, à l'aide denp.arange(len(df))//2
- de sorte qu'il fonctionne pour tous les indices) et ensuite utiliser groupby:np.arange(len(df))//2
au lieu de cela, dans le cas où l'indice n'est pas simplement 0,1,2.. etc.df.groupby(np.arange(len(df.index))//2).mean()
😉NumPythonic façon serait d'extraire les éléments d'un tableau NumPy avec
df.values
, puis remodeler à un3D
tableau avec2
éléments le long deaxis=1
et4
le long deaxis=2
et d'effectuer la réduction moyenne le long deaxis=1
et enfin revenir à un dataframe, comme leComme il s'avère, vous pouvez introduire NumPy est très efficace outil :
np.einsum
pour ce faireaverage-reduction
comme une combinaison desum-reduction
etscaling-down
, comme leVeuillez noter que les approches proposées supposent que le nombre de lignes est divisible par
2
.Aussi comme
noté par @DSM
, afin de préserver les noms de colonne, vous devez ajoutercolumns=df.columns
lors de la conversion de retour à Dataframe, c'est à dire -Exemple d'exécution -
Exécution des tests -
Dans cette section, nous allons tester tous les trois approches présentées jusqu'à présent pour résoudre le problème de la performance, y compris
@ayhan de la solution avec groupby
.columns=df.columns
pour corriger cela.Vous pouvez aborder ce problème à l'aide de
pd.rolling()
pour créer une moyenne mobile et puis il suffit de saisir chaque deuxième élément à l'aide deiloc
Noter que la première observation sera absent (c'est à dire les rolling commence en haut)