3
votes

Besoin d'obtenir des valeurs classées dans une colonne après le groupe par

J'ai un dataframe comme ci-dessous:

def get_cards(x):
    extra = {'S', 'A','M', 'E', 'G','D'}.difference(set(x))
    x=x.append(pd.Series(list(extra)))
    return ",".join(x.tolist())

temp1.groupby(['Card_x','Country', 'Age', 'Code'])['Card_y'].apply(lambda x: get_cards(x) ).reset_index()

Mon Dataframe attendu:

Card_x  Country Age     Code       Card_y
S       INDIA   Adult   Garments    S,E,D,G,M,A
S       INDIA   Adult   Grocery     D,S,G,A,M,E

Explication: Je veux obtenir les cartes classées dans "Card_y" en fonction des valeurs de "Diff" pour chaque "Code"

Par exemple.

  • "Vêtements" a la valeur "S" avec le moins "Diff" - 9.2 donc il vient en premier.
  • 'Garments' a la valeur 'E' avec "Diff" - 19.17 donc il vient en deuxième et ainsi de suite.

J'ai essayé le code ci-dessous:

Card_x  Country Age Code    Card_y  Diff
S   INDIA   Adult   Garments    S   9.2
S   INDIA   Adult   Grocery     S   21.33
S   INDIA   Adult   Garments    M   151.4
S   INDIA   Adult   Grocery     M   202.15
S   INDIA   Adult   Grocery     G   48.7
S   INDIA   Adult   Garments    G   126.82
S   INDIA   Adult   Garments    E   19.17
S   INDIA   Adult   Grocery     E   276.09
S   INDIA   Adult   Grocery     D   3.05
S   INDIA   Adult   Garments    D   69.43
S   INDIA   Adult   Grocery     A   109.47
S   INDIA   Adult   Garments    A   161.75

Mais je n'ai pas obtenu les résultats escomptés.


0 commentaires

3 Réponses :


3
votes

Essayez :

   Card_x Country    Age      Code       Card_y
0      S   INDIA  Adult  Garments  S,E,D,G,M,A
1      S   INDIA  Adult   Grocery  D,S,G,A,M,E

Sortie:

df.sort_values('Diff').groupby(['Card_x','Country','Age','Code'])['Card_y']\
                      .agg(','.join).reset_index()

Pas dans la liste alors utilisez

  Card_x Country    Age      Code              Card_y
0      S   INDIA  Adult  Garments  [S, E, D, G, M, A]
1      S   INDIA  Adult   Grocery  [D, S, G, A, M, E]

Sortie:

df.sort_values('Diff').groupby(['Card_x','Country','Age','Code'])['Card_y']\
                      .agg(list).reset_index()


1 commentaires

Merci, mais les valeurs de Card_y ne devraient pas figurer dans une liste.



1
votes

Utilisez sort_values ​​ avec groupby et join:

df = df.sort_values(['Card_x','Country', 'Age', 'Code', 'Diff'])

df1 = (df.groupby(['Card_x','Country', 'Age', 'Code'])['Card_y']
         .apply(','.join)
         .reset_index())
print (df1)
  Card_x Country    Age      Code       Card_y
0      S   INDIA  Adult  Garments  S,E,D,G,M,A
1      S   INDIA  Adult   Grocery  D,S,G,A,M,E


1 commentaires

Merci @jezrael, celui-ci fonctionne également. Mais depuis que j'ai utilisé le premier code, j'ai dû l'accepter. Merci encore.



0
votes

Je voudrais commencer par trier votre DataFrame, puis GroupBy Card_y et obtenir une liste. Cela devrait faire l'affaire.

df.sort_values("Diff").groupby(["Card_x", "Country","Age","Code"])["Card_y"].apply(list).reset_index()


1 commentaires

Merci @Nathan Quinteiro, mais depuis que j'ai utilisé le premier code, j'ai dû l'accepter. Merci encore.