essayant actuellement de calculer un rapport pour un jeu de données qui ressemble à quelque chose comme ceci: Ce jeu de données est un fichier de données Pandas. Mon objectif est de calculer le ratio de migration d'un pays à un autre. Par exemple, le ratio migration de 'FOO' à 'Bar' sur 'Bar' à "FOO".
Dans ce cas, il serait 123/222 = 0,55 p> En outre, si possible les regrouper dans un seul jeu de données ou plusieurs sous-ensembles, par exemple, à la mode suivante: P> def calcOutToInRatio(self, data):
oiRatio = 0.0
dfMig = data.groupby(['A','B'], as_index=False)['Migration'].mean()
dfMigRev = data.groupby(['B','A'], as_index=False)['Migration'].mean()
dfGrouped = dfMig.loc[(dfMig['A'] == dfMigRev['B']) & (dfMigRev['A'] == dfMig['B'])]
print(dfGrouped)
return oiRatio
4 Réponses :
Utilisez dataframe.pivot_table code> pour mapper avec dataframe.lookup code> :
Merci pour la réponse, après avoir implémenté votre APRACH, je reçois l'exception: «Une ou plusieurs étiquettes de rangée n'a pas été trouvée» ... :( Aussi vérifié s'il y avait des fautes de frappe.
Vous pouvez Fusionner code> La table à elle-même (auto jointure dans SQL):
df.columns = ['Country_A', 'Country_B', 'A_to_B'] df1 = pd.merge(df, df, left_on=['Country_A', 'Country_B'], right_on=['Country_B', 'Country_A']) df['ratio'] = df1['A_to_B_x'] / df1['A_to_B_y']
Vous pouvez le faire par boucle mais @ Ansev's Réponse est plus logique: sortie: p>
df.columns = ['A','B','AtoB']
df1 = df.pivot_table('AtoB', index = ['A'], columns = ['B'])
df2 = pd.DataFrame(df1.to_numpy()/df1.to_numpy().T, columns = df1.columns, index = df1.index)
df2
Out[1]:
B bar foo qux
A
bar NaN 1.804878 NaN
foo 0.554054 NaN 0.708333
qux NaN 1.411765 NaN
df2 = df2.reset_index().melt(id_vars = ['A'],value_vars = df1.columns, value_name='ratio')
df2.drop(df2[df2['A']==df2['B']].index)
Out[2]:
A B ratio
1 foo bar 0.554054
2 qux bar NaN
3 bar foo 1.804878
5 qux foo 1.411765
6 bar qux NaN
7 foo qux 0.708333
Cela semble également une bonne approche, mais après la mise en œuvre de cela, je reçois une exception: «Les opérandes n'ont pas pu être diffusés avec des formes» il peut y avoir quelque chose de mal avec les valeurs de mon Dataframe?
Est-ce à la division Numpy Matrix? Peut-être que vous pouvez montrer une partie de votre réel Dataframe?
Merci pour d'autres commentaires :) Cependant, la solution proposée par @mykola travaille parfaitement et elle est extrêmement simple.
Oui, pour moi, cette solution ci-dessus - de Mycola et d'Ansev - sont plutôt bonnes!