2016-09-18 1 views
0

Je souhaite utiliser https://github.com/datamade/dedupe pour dédupliquer certains enregistrements en python. En regardant leurs exemplesEnregistrements dédupliqués Python - déduplication

data_d = {} 
for row in data: 
    clean_row = [(k, preProcess(v)) for (k, v) in row.items()] 
    row_id = int(row['id']) 
    data_d[row_id] = dict(clean_row) 

le dictionnaire consomme beaucoup de mémoire par rapport à par ex. un dictionnaire créé par des pandas sur un pd.Datafrmae, ou même un pd.Dataframe normal.

Si ce format est requis, comment puis-je convertir un fichier pd.Dataframe efficacement dans un tel dictionnaire?

modifier

exemple ce pandas géants génère

{'column1': {0: 1389225600000000000, 
    1: 1388707200000000000, 
    2: 1388707200000000000, 
    3: 1389657600000000000,.... 

Exemple ce dedupe attend

{'1': {column1: 1389225600000000000, column2: "ddd"}, 
'2': {column1: 1111, column2: "ddd} ...} 
+0

Vous pouvez convertir un Dataframe Pandas en dictionnaire en utilisant 'DataFrame.to_dict()', c'est ce que vous cherchez? –

+0

En effet, mais c'est Colonne> Index> Valeur et ils semblent exiger Index> Colonne> Valeur qui recrée la clé de colonne pour chaque enregistrement –

+0

Je pense que cela bénéficierait grandement d'un exemple avec des données. – chthonicdaemon

Répondre

2

Il semble que df.to_dict(orient='index') produira la représentation que vous recherchez:

pandas géants à l'importation

data = [[1, 2, 3], [4, 5, 6]] 
columns = ['a', 'b', 'c'] 

df = pandas.DataFrame(data, columns=columns) 

df.to_dict(orient='index') 

résultats dans

{0: {'a': 1, 'b': 2, 'c': 3}, 1: {'a': 4, 'b': 5, 'c': 6}} 
0

Vous pouvez essayer quelque chose comme ceci:

df = pd.DataFrame({'A': [1,2,3,4,5], 'B': [6,7,8,9,10]}) 
A B 
0 1 6 
1 2 7 
2 3 8 
3 4 9 
4 5 10 

print(df.T.to_dict()) 
{0: {'A': 1, 'B': 6}, 1: {'A': 2, 'B': 7}, 2: {'A': 3, 'B': 8}, 3: {'A': 4, 'B': 9}, 4: {'A': 5, 'B': 10}} 

C'est la même sortie que pour répondre @chthonicdaemon si sa réponse est sans doute mieux. J'utilise pandas.DataFrame.T pour transposer l'index et les colonnes.

0

Un dictionnaire python n'est pas requis, vous avez juste besoin d'un objet permettant l'indexation par nom de colonne. à savoir row['col_name']

Donc, en supposant data est un dataframe de pandas géants devrait juste être capable de faire quelque chose comme:

data_d = {} 
for row_id, row in data.iterrows(): 
    data_d[row_id] = row 

Cela dit, la surcharge de mémoire de dicts python ne va pas être là où vous avez des goulots d'étranglement de mémoire dans dédupe.