0
votes

Pandas DataFrame Groupby Où Colonne une valeur == Valeur B

essayant actuellement de calculer un rapport pour un jeu de données qui ressemble à quelque chose comme ceci: xxx pré>

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


0 commentaires

4 Réponses :


2
votes

Utilisez dataframe.pivot_table pour mapper avec dataframe.lookup : xxx


1 commentaires

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.



3
votes

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']


0 commentaires

1
votes

Vous pouvez le faire par boucle mais @ Ansev's Réponse est plus logique: xxx

sortie: xxx


0 commentaires

1
votes
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

4 commentaires

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!