Проблема
Я обрабатываю несколько баз данных и все таблицы, которые они содержат.Чтобы дать вам оценку, каждая база данных составляет около 150 МБ и содержит в среднем 10-15 таблиц.Общее количество столбцов составляет 1400 столбцов.Я надеюсь, что этих данных достаточно, чтобы описать размер проблемы, с которой я имею дело.
Задача
Цель состоит в том, чтобы поместить все столбцы в массив данных, основываясь на их типе (либо numeric
или string
) и так, будет 2 кадра данных: 1) строковый кадр данных и 2) числовой кадр данных.
Для каждого кадра данных у нас будет индекс кадра данных, который состоит из всехуникальные значения во всех столбцах во всех таблицах из всех баз данных.Индекс будет отсортирован в порядке возрастания.
Значение в каждом столбце отсортировано в порядке возрастания, и сохраняются только уникальные значения.Это означает, что длина каждого столбца будет изменяться до слияния.
Слияние будет происходить по индексу фрейма данных, поэтому оставшиеся строки каждого столбца будут NA, что мне и нужно.
Окончательный результат представляет собой фрейм данных, где: - индекс: отсортированные уникальные значения из всех столбцов во всех таблицах из всех баз данных - столбцы: все столбцы во всех таблицах из всех баз данных, значения которых являются уникальными и NA
Цель
После того, как кадр данных завершен, я перебираю значения индекса этого кадра и записываю, какие столбцы содержат это значение индекса.
В конце я хочу узнать, какой столбец являетсяпотомок какого столбца.
Challenge
Слияние каждого столбца происходит очень медленно, в среднем около 5-7 секунд для каждого слияния, и оно в основном становится медленнее по мере увеличения размера кадра данных (так какбольше столбцов объединяются).
Текущий код для объединения
df
: исходный кадр данных, где его индекс - это все уникальное значениеиз всех столбцов во всех таблицах из всех баз данных, отсортированных в порядке возрастания
int_unique_values
: список, содержащий все уникальные значения из всех столбцов во всех таблицах из всех баз данных, отсортированных в порядке возрастания
column_dict
: словарь, в котором ключами являются имя столбца, а значения - уникальные значения столбца в порядке возрастания
# initial dataframe containing the index values
int_df = pd.DataFrame(data=int_unique_values, columns=['index_value']).set_index('index_value')
def merge_col_to_df(dataframe, column_dict):
for column in column_dict:
df_to_join = pd.DataFrame(data=np.column_stack([column_dict[column], column_dict[column]]),
columns=['cursor_value', column]).set_index('cursor_value')
dataframe = dataframe.join(df_to_join)
return dataframe
merge_col_to_df(int_df, column_dict)
Пример окончательного фрейма данных (числовой)
CustomerId TransactionId StoreId
0 0 0 0
1 1 NaN 1
2 2 NaN NaN
3 3 3 3
4 4 4 4
ТогдаЯ перебираю значение индекса, начиная с самого низкого значения, которое в данном примере равно 0, и нахожу, какие столбцы содержат его: ['TransactionId', 'StoreId']
.Итерация продолжается до конца.
К концу итерации я узнаю, что TransactionId
является дочерним элементом CustomerId
, а StoreId
является дочерним элементом CustomerId
.
Справка
Есть ли другой способ сделать быстрое объединение?Или достичь цели, которую я хочу, по-другому?