J'ai deux trames de données df1 et df2. Les deux ont une première colonne commune SKUCode = SKU

Df1:

enter image description here

Df2:

enter image description here

Je veux mettre à jour df1 et définir SKUStatus = 0 si SKUCode correspond à SKU dans df2.

Je veux ajouter une nouvelle ligne à df1 si SKU de df2 n'a pas de correspondance avec SKUCode.

Donc, après l'opération, df1 ressemble à ceci:

enter image description here

Une façon dont je pourrais faire cela est via df2.iterrows () et en passant par les valeurs, mais je pense qu'il doit y avoir une autre façon intéressante de faire cela? Je vous remercie

import pandas as pdx

df1=pdx.DataFrame({'SKUCode':['A','B','C','D'],'ListPrice':[1798,2997,1798,999],'SalePrice':[1798,2997,1798,999],'SKUStatus':[1,1,1,0],'CostPrice':[500,773,525,300]})

df2=pdx.DataFrame({'SKUCode':['X','Y','B'],'Status':[0,0,0],'e_date':['31-05-2020','01-06-2020','01-06-2020']})


df1.merge(df2,left_on='SKUCode')
0
failsafe100 2 juin 2020 à 14:13

3 réponses

Meilleure réponse

Essayez ceci, en utilisant outer merge qui donne à la fois les enregistrements correspondants et non correspondants.

In [75]: df_m = df1.merge(df2, on="SKUCode", how='outer')                                                                                                         

In [76]: mask = df_m['Status'].isnull()                                                                                                                       

In [77]: df_m.loc[~mask, 'SKUStatus'] = df_m.loc[~mask, 'Status']

In [78]: df_m[['SKUCode', "ListPrice", "SalePrice", "SKUStatus", "CostPrice"]].fillna(0.0)

Production

  SKUCode  ListPrice  SalePrice  SKUStatus  CostPrice
0       A     1798.0     1798.0        1.0      500.0
1       B     2997.0     2997.0        0.0      773.0
2       C     1798.0     1798.0        1.0      525.0
3       D      999.0      999.0        0.0      300.0
4       X        0.0        0.0        0.0        0.0
5       Y        0.0        0.0        0.0        0.0
0
sushanth 2 juin 2020 à 12:31

Vous devriez jeter un œil à pd.merge function [https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html].

Renommez d'abord une colonne avec le même nom (par exemple, renommez SKU en SKUCode). Puis essayez:

df1.merge(df2, left_on='SKUCode')

Si vous fournissez des données d'entrée (pas des captures d'écran), je peux essayer avec les paramètres appropriés.

0
pyOliv 2 juin 2020 à 11:19

Je ne sais pas exactement si je vous ai bien compris mais je pense que vous pouvez utiliser .loc. quelque chose du genre:

df1.loc[df2['SKUStatu'] != 0, 'SKUStatus'] = 1
0
snatchysquid 2 juin 2020 à 11:18