J'ai une table qui ressemble à ceci: Nom d'utilisateur de la célébrité Un utilisateur1 B utilisateur1 C utilisateur2 Un utilisateur3 Un utilisateur2 D utilisateur2 D utilisateur3 J'ai écrit une fonction pour trouver les chevauchements d'utilisateurs entre deux célébrités: def ...

4
Jinhang Jiang 17 mars 2021 à 04:30

3 réponses

Meilleure réponse

Premièrement, la fonction num_of_fans_overlap ne doit pas renvoyer un print().

def num_of_fans_overlap(cel1,cel2,data):
    l = [cel1,cel2]
    Res = len(data.loc[data['Usernames'].map(data.groupby('Usernames').agg(set)['Celebrity'].eq(set(l)))])/2
    return int(Res)

Deuxièmement, si la variable celebrities est une liste de valeurs uniques dans la colonne Celebrity.


from itertools import combinations
celebrities = list(data.Celebrity.unique())
for (cel1, cel2) in combinations(celebrities, 2):
   fans_overlap = num_of_fans_overlap(cel1, cel2, data)
   print((cel1, cel2, fans_overlap))
0
Sebastian Borquez Gonzalez 17 mars 2021 à 01:41

La manière naïve de faire ceci:

celebs = ["A", "B", "C", "D"]
for i in range(len(celebs)):
    for j in range(i+1, len(celebs)):
        celeb_pairs = (celebs[i], celebs[j])
        run_your_function_here(*celeb_pairs, other, parameters)

Vous pouvez également le faire avec élégance en utilisant la fonction itertools.combinations:

import itertools

celebs = ["A", "B", "C", "D"]
for celeb1, celeb2 in itertools.combinations(celebs, 2):
    run_your_function_here
0
6etacat 17 mars 2021 à 01:44

Vérifiez avec crosstab puis dot

s = pd.crosstab(df.Celebrity,df.Username)
s = s.dot(s.T)
out = s.mask(np.triu(np.ones(s.shape)).astype(bool)).stack()
Out[301]: 
Celebrity  Celebrity
B          A            1.0
C          A            1.0
           B            0.0
D          A            2.0
           B            0.0
           C            1.0
dtype: float64
1
BENY 17 mars 2021 à 01:43