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 | +---+---------+------+------+------+
.
3 Réponses :
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.
Pourquoi pas simplement
((df2-df1)/df1).style.format('{:.0%}')
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.
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 >
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
Qu'est-ce que tu as essayé jusque-là?