J'essaie de créer une liste de bords (un ensemble unique de a;b, a;c, a;f, etc, où a;b == b;a) à partir d'un très grand (long) cadre de données de pandas qui a deux colonnes . Les listes d'arêtes requises se situent entre toutes les combinaisons de lignes d'une colonne à condition que l'autre colonne ait la même valeur. Un exemple ci-dessous montre ceci :
df1 = pd.DataFrame({'A':['Mary', 'Mary', 'Mary', 'Clive','Clive','Clive', 'John', 'John'],
'B':['Apples','Oranges','Strawberries','Apples','Pears','Bananas','Bananas','Pears']})
Et ce dataframe ressemble à:
A B
0 Mary Apples
1 Mary Oranges
2 Mary Strawberries
3 Clive Apples
4 Clive Pears
5 Clive Bananas
6 John Bananas
7 John Pears
avec la sortie prévue ressemblant à ceci:
Apples; Oranges
Apples; Strawberries
Oranges; Strawberries
Apples; Pears
Apples; Bananas
Pears; Bananas
Ma solution actuelle est extrêmement lente et boucle sur les valeurs uniques de A (avec un pré-filtrage pour s'assurer que le nombre de A est > 1 (sinon pas de bord par paire)), en prenant des index booléens de la trame de données :
for person in df1['A'].unique():
temp = df1[df1['A']==person]
...
perform some combination\itertools on df1['B']
Cependant, parce que mon df1 est en réalité extrêmement volumineux, cela prend un temps démesuré : y a-t-il une astuce ici utilisant les lambdas et l'empilement qui me manque ? J'apprécie vraiment toute aide !
Que dis-tu de ça?
In [10]: df1.groupby('A')['B'].apply(lambda x : list(itertools.combinations(x,2)))
Out[10]:
A
Clive [(Apples, Pears), (Apples, Bananas), (Pears, B...
John [(Bananas, Pears)]
Mary [(Apples, Oranges), (Apples, Strawberries), (O...
Name: B, dtype: object
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots