2016-09-18 2 views
0

Я хочу использовать https://github.com/datamade/dedupe для дедупликации некоторых записей в python. Глядя на их примерыPython debuplicate records - dedupe

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) 

Словарь потребляет довольно много памяти по сравнению с, например, словарь, созданный pandas из pd.Datafrmae, или даже обычный pd.Dataframe.

Если этот формат не требуется, как можно эффективно преобразовать pd.Dataframe в такой словарь?

редактировать

Пример того, что панды генерирует

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

Пример того, что дедупликации ожидает

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

Вы можете преобразовать Pandas Dataframe в словарь с помощью 'DataFrame.to_dict()', это то, что вы ищете? –

+0

Действительно, но это Column> Index> Value, и они, похоже, требуют Index> Column> Value, который перегенерирует ключ столбца для каждой записи. –

+0

Я думаю, что это принесет пользу из примера с данными. – chthonicdaemon

ответ

2

Оказывается, что df.to_dict(orient='index') произведет представление вы ищете:

импортных панд

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

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

df.to_dict(orient='index') 

приводит

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

Вы можете попробовать что-то вроде этого:

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}} 

Это тот же результат, как и в @chthonicdaemon ответ, чтобы его ответ, вероятно, лучше. Я использую pandas.DataFrame.T для переноса индекса и столбцов.

0

Словарь python не требуется, вам просто нужен объект, который позволяет индексировать по имени столбца. т.е. row['col_name']

Таким образом, если предположить data является панда dataframe просто должен быть в состоянии сделать что-то вроде:

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

Тем не менее, накладные памяти питона dicts не собираются быть там, где у вас есть узкие места памяти в дедупликации.