Tengo este conjunto de datos

custID     documentno    quantity    producttype
1          1281261658       3        accesories
1          1281261658       3        major
1          1281261658       3        accesories
2          0105162445       2        major      
2          0105162445       2        major
3          0100848728       2        major
3          0100848728       2        accesories
4          0106075074       1        major

Por lo tanto, quiero filtrar el conjunto de datos de una manera que no quiero documentos con al menos uno 'accesorios' en él. Por lo tanto, quiero eliminar documentos con solo 'importante' en él.

custID = {1,1,1,2,2,3,3,4}
documentno = {1281261658,1281261658,1281261658,0105162445,0105162445,0100848728,0100848728,0106075074}
quantity = {3,3,3,2,2,2,2,1}
producttype = {'accesories','major','accesories','major','major','major','accesories','major'}

El resultado final es:

id     documentno   quantity    producttype
1      1281261658      3        accesories
1      1281261658      3        major
1      1281261658      3        accesories
3      0100848728      2        major
3      0100848728      2        accesories

Intenté con otra cosa, pero no pude hacerlo.

Gracias de antemano

0
Praveen Bushipaka 25 jun. 2020 a las 13:31

2 respuestas

La mejor respuesta

Dado pd.DataFrame df:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,4],
                   'documentno' : ['1281261658','1281261658','1281261658','0105162445','0105162445','0100848728','0100848728','0106075074'],
                   'quantity' : [3,3,3,2,2,2,2,1],
                   'producttype' : ['accesories','major','accesories','major','major','major','accesories','major']})

Pruebe lo siguiente:

df.loc[df.documentno.isin(df.documentno[df.producttype.eq('accesories')].unique()),:]

El resultado es:

   id  documentno  quantity producttype
0   1  1281261658         3  accesories
1   1  1281261658         3       major
2   1  1281261658         3  accesories
5   3  0100848728         2       major
6   3  0100848728         2  accesories

Como filtro se utiliza df.documentno[df.producttype.eq('accesories')] que devuelve valores documentno que tienen uno o más accesories. Supongo que quantity en el conjunto de datos df siempre es mayor que 0.

Sin embargo, si quantity puede ser cero:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,4],
                   'documentno' : ['1281261658','1281261658','1281261658','0105162445','0105162445','0100848728','0100848728','0106075074'],
                   'quantity' : [3,3,3,2,2,2,0,1],
                   'producttype' : ['accesories','major','accesories','major','major','major','accesories','major']})

Simplemente agregue la condición df.quantity.gt(0):

df.loc[ df.documentno.isin(df.documentno[(df.producttype.eq('accesories') & df.quantity.gt(0))].unique()) ,:]
0
ipj 25 jun. 2020 a las 14:15

Aquí está el método que seguí,

Primero haciendo otra columna con el número de diferentes tipos de productos para un documento

df['n_cats'] = df.groupby('documentno')['producttype'].transform('nunique')

Luego descartando los valores que son solo con mayor

df = df.drop(df[(df['n_cats'] == 1) & (df['producttype'] == 'major')].index)

Gracias

0
Praveen Bushipaka 25 jun. 2020 a las 15:20