Trabajando con este marco de datos df:

Customer_ID | transaction_nr | item_ID
ABC            1                6438097
ABC            2                9703489
ABC            2                6438097
BCD            1                0093753
BCD            2                9084378
BCD            3                9084378

Quiero calcular el recuento distinto de Customer_ID que tienen el mismo item_ID en la transacción 1 y 2. Por separado, quiero calcular el recuento distinto de Customer_iD que tienen el mismo item_if en la transacción 2 y 3.

¿Cómo puedo hacerlo, sin girar y contar manualmente?

2
jeangelj 27 oct. 2017 a las 18:23

3 respuestas

La mejor respuesta

Puede usar un grupo al aplicar:

In [11]: df.groupby(["Customer_ID", "item_ID"]).apply(lambda x: x["transaction_nr"].isin([1, 2]).sum() == 2)
Out[11]:
Customer_ID  item_ID
ABC          6438097     True
             9703489    False
BCD          93753      False
             9084378    False
dtype: bool

In [12]: df.groupby(["Customer_ID", "item_ID"]).apply(lambda x: x["transaction_nr"].isin([2, 3]).sum() == 2)
Out[12]:
Customer_ID  item_ID
ABC          6438097    False
             9703489    False
BCD          93753      False
             9084378     True
dtype: bool

# To get the count:
In [13]: df.groupby(["Customer_ID", "item_ID"]).apply(lambda x: x["transaction_nr"].isin([2, 3]).sum() == 2).sum()
Out[12]: 1

Aquí, la solicitud:

.apply(lambda x: x["transaction_nr"].isin([1, 2]).sum() == 2)

Comprueba si hay tanto transaccion_nr 1 como 2 (si existe la suma será 2), también para 2 y 3.

Nota: puede que tenga que .drop_duplicates primero, dependiendo de si eso está garantizado en su conjunto de datos.

1
Andy Hayden 27 oct. 2017 a las 15:31

Simplemente llame a {{X0} } y pase pd.Series.value_counts:

In [212]:
df = pd.DataFrame(np.random.randint(0, 2, (10, 4)), columns=list('abcd'))
df.apply(pd.Series.value_counts)

Out[212]:
   a  b  c  d
0  4  6  4  3
1  6  4  6  7
1
Tim Givois 27 oct. 2017 a las 15:28

Al usar crosstab

pd.crosstab(df['Customer_ID'],df['transaction_nr'],df['item_ID'],aggfunc=len)
    Out[795]: 
    transaction_nr    1    2    3
    Customer_ID                  
    ABC             1.0  2.0  NaN
    BCD             1.0  1.0  1.0

Aquí está la verificación de la identificación

pd.crosstab(df['Customer_ID'],df['item_ID'],df['transaction_nr'].isin([1,2]),aggfunc=sum)
Out[798]: 
item_ID      93753    6438097  9084378  9703489
Customer_ID                                    
ABC              NaN      2.0      NaN      1.0
BCD              1.0      NaN      1.0      NaN
1
YOBEN_S 27 oct. 2017 a las 15:31