2016-03-14 7 views
1

Я получил фрагмент кода из Интернета, чтобы разделить категориальные столбцы кадра данных pandas, но мне трудно понять его, поскольку я новичок в python.факторизовать столбцы кадра данных pandas

Может кто-нибудь объяснить следующий фрагмент кода за строкой.

train и test - это кадры данных pandas с одинаковыми столбцами по порядку.

for (train_name, train_series), (test_name, test_series) in zip(train.iteritems(),test.iteritems()): 
    if train_series.dtype == 'O': 
     #for objects: factorize 
     train[train_name], tmp_indexer = pd.factorize(train[train_name]) 
     test[test_name] = tmp_indexer.get_indexer(test[test_name]) 

Я особенно заинтересован в линии test[test_name] = tmp_indexer.get_indexer(test[test_name])

А также, пожалуйста, объяснить, что именно делает pd.factorize делает? Преобразует ли символы символы «А», «АА», «ААА» в разные числовые факторы?

ответ

5

Первая строка: iteritems выполняет итерации по столбцам данных и возвращает (column_name, actual_column) пар. По zip пинг и деструктуризации в for линии, вы в конечном итоге с:

  • train_name: название текущего столбца в train dataframe;
  • test_name: название соответствующей колонки в test dataframe;
  • train_series и test_series: фактические столбцы (в виде серии pandas).

Вторая линия: это проверяет, если столбец имеет тип Object, по существу, это означает, что она содержит строки и категорический столбец.

Третья линия: factorize вернется в второй позиции, список уникальных значений (или категориальных меток) в предоставленном колонке, и, в первой позиции, индексы, которые позволили бы вам воссоздать исходный столбец от уникальных значений. Другими словами:

labels, uniques = pd.factorize(column) 
for i in range(len(column)): 
    print(column[i] == uniques[labels[i]]) # True 

Продолжая деструктурирующие заданий, текущего train столбца train[train_name] будет заменен на индексной основе представления, в то время как tmp_indexer воля содержит уникальные значения в исходном train[train_name].

Четвертая строка: get_indexer будет возвращать индексы, где значения в test[test_name] должны быть найдены в tmp_indexer. В результате текущий столбец test заменяется списком индексов точно так же, как соответствующий столбец train находится в строке выше.

Конечный результат: обе колонки в train и test пошли из ряда строк (категориальные значения) для ряда численных значений индекса, как индексированный по одной и той же (временного) объекта.

+0

- функция 'zip' для одновременной итерации двух вещей? Может ли он использоваться для перебора любых вещей 'x' одновременно? – user3664020

+1

Да: zip (["a", "b"], [1, 2]) = [("a", 1), ("b", 2)] например. – IanS

+0

Как молния, он застегивает два списка вместе. – IanS

Смежные вопросы