Cela ne semblait pas fonctionner avec to_dict, alors je l'ai essayé moi-même. La raison était que je voulais traiter les données d'achat par co-filtrage, mais avec une trame de données Cela ne semblait pas fonctionner. Aussi, j'aimerais essayer la logique de recommandation comme dans la programmation d'intelligence collective. Je voulais utiliser les données dans la trame de données à portée de main en les convertissant d'une manière ou d'une autre.
# coding: utf-8
import pandas as pd
from collections import defaultdict
df = pd.DataFrame({'id':['a','a','b','b','c',], 'shouhin':['x', 'y', 'y','z', 'x']})
Supposons que vous ayez les données suivantes
id shouhin
0 a x
1 a y
2 b y
3 b z
4 c x
Le but est de changer cela en un dictionnaire comme celui ci-dessous.
{'a': ['y', 'x'], 'b': ['y', 'z'], 'c': ['x']}
Tout d'abord, créez un dictionnaire avec defaultdict. Ensuite, récupérez chaque ligne avec df.values et créez un dictionnaire avec des éléments imbriqués. (df.values renvoie numpy.array)
tempdic = defaultdict(dict)
for d in df.values:
tempdic[d[0]][d[1]] = 1.0 #Toute valeur est acceptable
Ensuite, vous pouvez effectuer les opérations suivantes.
dic = {k: tempdic[k].keys() for k in tempdic}
En regardant le dic, c'est comme prévu
{'a': ['y', 'x'], 'c': ['x'], 'b': ['y', 'z']}
Si vous utilisez set, vous pouvez obtenir des produits courants et il est facile de calculer le coefficient jaccard.
{'y'}```
Même si vous ne définissez pas la première partie sur df.values, vous pouvez faire une boucle et obtenir les éléments de chaque ligne avec df.iloc [numéro de ligne].
C'est possible, mais dans ce cas, la vitesse est beaucoup plus lente.
Dans le cas de l'achat de données, je pense que la quantité de données est assez grande, donc c'est difficile si c'est lent ici.
De plus, je pense qu'il existe un moyen de tout faire à la fois en utilisant while et if, mais cela donne également la priorité à la vitesse.
J'essaye de ne pas utiliser une telle méthode.
Recommended Posts