Фрейм данных Python Pandas объединяет сотни столбцов в один фрейм данных и заполняет несопоставленные строки NA - PullRequest
0 голосов
/ 08 февраля 2019

Проблема

Я обрабатываю несколько баз данных и все таблицы, которые они содержат.Чтобы дать вам оценку, каждая база данных составляет около 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.

Справка

Есть ли другой способ сделать быстрое объединение?Или достичь цели, которую я хочу, по-другому?

...