Trouver le nombre de toutes les paires dans le tableau par colonnes spécifiques
J'ai un dataframe avec des colonnes comme semaine, boutique, marque. Par exemple
week shop brand
1 1 cola
1 2 sprite
1 3 pepsi
1 4 pepsi
2 1 cola
2 2 sprite
2 3 sprite
2 4 sprite
Je veux savoir combien de magasins rencontrent quelques marques chaque semaine Le tableau des résultats est:
week brand1 brand2 num_shops
1 cola sprite 1
1 cola pepsi 2
1 sprite cola 1
1 sprite pepsi 1
1 pepsi cola 2
1 pepsi sprite 1
2 cola sprite 3
2 sprite cola 3
Je sais que je devrais probablement faire
def func(x):
x1 = x.merge(x,on=["week"],suffixes =('1','2'))
x1.groupby(["brand1","brand2"]).apply(func1)
return x1
def func1(x):
#make count
data.groupby(["week"]).apply(func)
Puis-je le faire plus rapidement si j'ai beaucoup de données?
Edit: La colonne num_shops s'est formée comme suit: Nous prenons une semaine. Regardez toutes les paires de marques dessus et nous regardons combien de paires répétées. Par exemple, nous obtenons d'abord une table comme celle-ci, puis nous obtenons des informations sur num_shops:
week brand1 brand2
1 cola sprite
1 cola pepsi
1 cola pepsi
1 sprite cola
1 sprite pepsi
1 pepsi cola
1 pepsi cola
1 pepsi sprite
2 cola sprite
2 cola sprite
2 cola sprite
2 sprite cola
2 sprite cola
2 sprite cola
Utilisez merge
avec DataFrame.query
pour filtrer les mêmes valeurs dans les deux brand
, puis comptez par DataFrame.groupby
avec GroupBy.size
:
df = (df.merge(df,on=["week"], suffixes= ('1','2'))
.query("brand1 != brand2")
.groupby(['week','brand1','brand2'], sort=False)
.size()
.reset_index(name='num_shops'))
print (df)
week brand1 brand2 num_shops
0 1 cola sprite 1
1 1 cola pepsi 2
2 1 sprite cola 1
3 1 sprite pepsi 2
4 1 pepsi cola 2
5 1 pepsi sprite 2
6 2 cola sprite 3
7 2 sprite cola 3
ÉDITER:
Votre solution doit être modifiée:
def func(x):
x1 = x.merge(x,on=["week"],suffixes =('1','2'))
x1 = x1[x1['brand1'].ne(x1['brand2'])]
return x1.groupby(["brand1","brand2"], sort=False).size()
df = df.groupby(["week"]).apply(func).reset_index(name='num_shops')
print (df)
week brand1 brand2 num_shops
0 1 cola sprite 1
1 1 cola pepsi 2
2 1 sprite cola 1
3 1 sprite pepsi 2
4 1 pepsi cola 2
5 1 pepsi sprite 2
6 2 cola sprite 3
7 2 sprite cola 3