我从互联网上获得了一段代码来分解大熊猫数据框的分类列,但由于我是python的新手,因此我很难理解它。
有人可以逐行解释下面这段代码。
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到底有什么作用?是否将字符“A”,“AA”,“AAA”转换为不同的数字因子?
答案 0 :(得分:6)
第一行:iteritems
遍历数据框的列并返回(column_name, actual_column)
对。通过zip
行for
ping和解构,最终得到:
train_name
:train
数据框中的当前列的名称; test_name
:test
数据框中相应列的名称; 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
和CONCURRENT_REQUESTS_PER_DOMAIN = 32
中的两列都从一系列字符串(分类值)变为一系列数字索引值,两者都在相同(临时)的对象。