1
votes

Calculez le pourcentage de changement sur plusieurs dataframes pandas

Supposons que j'ai deux dataframes pandas distincts, qui ont exactement la même structure:

df1:

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 50%  | 50%  | -50% |
+---+---------+------+------+------+
| 1 | mean    | -50% | -50% | -50% |
+---+---------+------+------+------+
| 2 | stddev  | 0%   | 0%   | 0%   |
+---+---------+------+------+------+
| 3 | min     | 0%   | 0%   | 0%   |
+---+---------+------+------+------+
| 4 | max     | -50% | 0%   | 0%   |
+---+---------+------+------+------+

et df2 :

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 15   | 15   | 5    |
+---+---------+------+------+------+
| 1 | mean    | 2    | 2.5  | 2.5  |
+---+---------+------+------+------+
| 2 | stddev  | 3    | 3    | 3    |
+---+---------+------+------+------+
| 3 | min     | 0    | -1   | 5    |
+---+---------+------+------+------+
| 4 | max     | 50   | 56   | 47   |
+---+---------+------+------+------+

Pour chaque entrée, je voudrais calculer le pourcentage de changement entre les valeurs des deux dataframes. Je suis conscient qu'il existe une fonction pct_change () , mais cela ne fonctionne que sur le même dataframe pandas. La sortie souhaitée est

+---+---------+------+------+------+
|   | summary | col1 | col2 | col3 |
+---+---------+------+------+------+
| 0 | count   | 10   | 10   | 10   |
+---+---------+------+------+------+
| 1 | mean    | 4    | 5    | 5    |
+---+---------+------+------+------+
| 2 | stddev  | 3    | 3    | 3    |
+---+---------+------+------+------+
| 3 | min     | 0    | -1   | 5    |
+---+---------+------+------+------+
| 4 | max     | 100  | 56   | 47   |
+---+---------+------+------+------+

.


1 commentaires

Qu'est-ce que tu as essayé jusque-là?


3 Réponses :


0
votes

Vous pouvez simplement concater vos 2 datframes en une seule

df = pd.concat ([df1, df2])

et utilisez la fonction pct_change () et définissez le paramètre périodes sur le nombre de colonnes de vos DataFrames.


0 commentaires

0
votes

Pourquoi pas simplement

((df2-df1)/df1).style.format('{:.0%}')


2 commentaires

J'ai donné un exemple assez minime. Comment géreriez-vous plus de 2 dataframes pandas? En réalité, j'aurais 10-15 dataframes différents.


Je ne sais pas ce que vous essayez d'accomplir. Voulez-vous calculer un changement de pourcentage par paire pour 10 à 15 dataframes? Échangez simplement df1 et df2 pour les données appropriées.



2
votes

Créez un index par colonnes de chaînes, divisez les DataFrames par DataFrame.div , soustrayez 1 par DataFrame.sub , multiple de DataFrame.mul :

L = [df1, df2]
df = (pd.concat(L, keys=range(len(L)))
        .set_index('summary', append=True)
        .groupby(level=1)
        .pct_change())

print (df)
             col1  col2  col3
    summary                  
0 0 count     NaN   NaN   NaN
  1 mean      NaN   NaN   NaN
  2 stddev    NaN   NaN   NaN
  3 min       NaN   NaN   NaN
  4 max       NaN   NaN   NaN
1 0 count     0.5   0.5  -0.5
  1 mean     -0.5  -0.5  -0.5
  2 stddev    0.0   0.0   0.0
  3 min       NaN   0.0   0.0
  4 max      -0.5   0.0   0.0

EDIT:

Si besoin pct_change entre DataFrames dans la liste, df1 avec df2, df2 avec df3 ...:

df = df2.set_index('summary').div(df1.set_index('summary')).sub(1).mul(100).reset_index()
print (df)
  summary  col1  col2  col3
0   count  50.0  50.0 -50.0
1    mean -50.0 -50.0 -50.0
2  stddev   0.0   0.0   0.0
3     min   NaN   0.0   0.0
4     max -50.0   0.0   0.0

p >


3 commentaires

J'ai donné un exemple assez minime. Comment géreriez-vous plus de 2 dataframes pandas? En réalité, j'aurais 10-15 dataframes différents.


@Tokyo - Je ne comprends pas - quelle est la sortie attendue dans 15 dataframes?


La première approche fonctionne parfaitement (pour deux dataframes). La seconde approche ne génère cependant pas les mêmes résultats