Je veux obtenir seulement les 5 meilleurs noms avec le plus grand nombre de correspondances à l'intersection. comment pourrais-je faire ça? ou en d'autres termes trier les correspondances dans l'ordre (max à min) et ne conserver que les cinq premières correspondances

# Sample Data
df = pd.DataFrame({'description': ['d1', 'd2', 'd3', 'd4', 'd5','d6'], 
                   'specialties': ['s1,s2,s3', 's3,s4,s5,s6', 's5,s6,s7','s3,s4,s5,s65','s35,s45,s5f,s6','s33,s4,s5,s6,s7']}, 
                   index=['name1', 'name2', 'name3','name4','name5','name6'])

# Sample Input
name_lookup = 'name3'

tgt_set = set(df.loc[name_lookup, 'specialties'].split(','))
intersection = df['specialties'].str.split(',').apply(lambda x: tgt_set.intersection(x))
match = intersection != set() # Remove companies with 0 matches

# Output:  
intersection[match] # will deliver the specialties they have in common   
df[match] # will return the data only on the ones that have at lest one specialty in common
0
irum zahra 18 mars 2019 à 12:30

2 réponses

Meilleure réponse

Utilisation:

#s = intersection[intersection != set()] 
#alternative
s = intersection[intersection.astype(bool)]
n = s.str.len().sort_values(ascending=False).index[:5]
print (n)
Index(['name6', 'name3', 'name2', 'name5', 'name4'], dtype='object')

Pour l'utilisation de DataFrame:

dftop5 = df.loc[n]
0
jezrael 18 mars 2019 à 10:10

Cela fournira les données pour le top 5:

df.loc[intersection.apply(len).sort_values().tail(5).index]
1
ecortazar 18 mars 2019 à 10:29