2 votes

Supprimer les valeurs après un '',''''.

Je dispose d'un ensemble de données (avec plusieurs colonnes, mais pour les besoins de l'échantillon, j'ai ajouté deux colonnes pertinentes).

 Type         SKU      Sizes
 Variable      3        XS,XS
 Variation     65       XS
 Variation     7        S,M,L
 variable      89       S
 Variation     90       M
 Variation     92       L

J'ai une liste de valeurs stockées dans dup_arr. Je veux supprimer toutes les tailles après ',' avec les valeurs SKU stockées dans dup_arr. Par exemple, si dup_arr = 3, je veux que le résultat final ressemble à

 Type         SKU      Sizes
 Variable      3        XS
 Variation     65       XS
 Variation     7        S,M,L
 variable      89       S
 Variation     90       M
 Variation     92       L

Notez que la première ligne n'a pas de XS après ','

J'essaie de parcourir en boucle chaque valeur et de vérifier les valeurs

for i in OF['SKU']:
    for j in dup_arr:
       if i == j:
          OF.loc[OF['Attribute 1 value(s)']  = OF['Attribute 1 value(s)'].str.split(',').str[0]

Cependant, il supprime toutes les tailles après ',' pour toutes les valeurs de SKU. Je peux comprendre ce qui se passe mais je ne sais pas comment supprimer toutes les tailles après ',' pour cette valeur SKU particulière stockée dans dup_arr.

2voto

Paul H Points 5612

Tout d'abord, vous presque jamais de boucler un cadre de données comme celui-là. Si vous vous retrouvez à écrire une boucle, trouvez un autre moyen.

Dans ce cas, j'utiliserais pandas.Series.where pour y parvenir :

from io import StringIO
import pandas
table = StringIO("""\
 Type         SKU      Sizes
 Variable      3        XS,XS
 Variation     65       XS
 Variation     7        S,M,L
 variable      89       S
 Variation     90       M
 Variation     92       L
""")
dup_arr = [3]
df = (
    pandas.read_table(table, sep='\s\s+')
        .assign(FirstSize=lambda df: df['Sizes'].where(
            ~df['SKU'].isin(dup_arr),          # condition to use original values
            df['Sizes'].str.split(',').str[0]  # all other values
        ))
)

df

Et cela me donne :

        Type  SKU  Sizes FirstSize
0   Variable    3  XS,XS        XS
1  Variation   65     XS        XS
2  Variation    7  S,M,L     S,M,L
3   variable   89      S         S
4  Variation   90      M         M
5  Variation   92      L         L

1voto

Joe Ferndz Points 7732

Vous pouvez donner une condition et supprimer la valeur.

Si vous disposez déjà d'un cadre de données et que vous souhaitez supprimer la valeur, utilisez ceci.

df['Sizes'] = df.apply(lambda x: x['Sizes'].split(',')[0] if x['SKU'] == sku_val else x['Sizes'], axis=1)

ou vous pouvez le donner comme ceci (en utilisant . au lieu de ['colname'] ):

df['Sizes'] = df.apply(lambda x: x.Sizes.split(',')[0] if x.SKU == sku_val else x.Sizes, axis=1)

Sortie - Avant :

        Type  SKU  Sizes
0   Variable    3  XS,XS
1  Variation   65     XS
2  Variation    7  S,M,L
3   variable   89      S
4  Variation   90      M
5  Variation   92      L

Sortie - Après :

        Type  SKU  Sizes
0   Variable    3     XS
1  Variation   65     XS
2  Variation    7  S,M,L
3   variable   89      S
4  Variation   90      M
5  Variation   92      L

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X