分解大熊猫数据框的列

时间:2016-03-14 14:31:52

标签: python for-loop pandas

我从互联网上获得了一段代码来分解大熊猫数据框的分类列,但由于我是python的新手,因此我很难理解它。

有人可以逐行解释下面这段代码。

traintest是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到底有什么作用?是否将字符“A”,“AA”,“AAA”转换为不同的数字因子?

1 个答案:

答案 0 :(得分:6)

第一行iteritems遍历数据框的列并返回(column_name, actual_column)对。通过zipfor ping和解构,最终得到:

  • train_nametrain数据框中的当前列的名称;
  • test_nametest数据框中相应列的名称;
  • train_seriestest_series:实际列(作为pandas系列)。

第二行:这会检查列是否为Object类型,这实际上意味着它包含字符串并且是一个分类列。

第三行factorize将在第二个位置返回所提供列中的唯一值(或分类标签)列表,并且第一个位置,这些索引可让您从唯一值重新创建原始列。换句话说:

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

继续进行解构分配,当前traintrain[train_name]将替换为其基于索引的表示,而tmp_indexer将包含原始train[train_name]中的唯一值

第四行get_indexer将返回test[test_name]tmp_indexertest中的值所在的索引。因此,当前train列将被索引列表替换,其方式与上面一行中相应的train列完全相同。

最终结果testCONCURRENT_REQUESTS_PER_DOMAIN = 32中的两列都从一系列字符串(分类值)变为一系列数字索引值,两者都在相同(临时)的对象。