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!