use*_*020 1 python for-loop pandas
我从互联网上获得了一段代码来分解大熊猫数据框的分类列,但由于我是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])
Run Code Online (Sandbox Code Playgroud)
我对行特别感兴趣 test[test_name] = tmp_indexer.get_indexer(test[test_name])
还请解释一下,pd.factorize到底有什么作用?是否将字符转换成"A","AA","AAA"转换成不同的数字因子?
第一行:iteritems迭代数据帧的列并返回(column_name, actual_column)对.通过在行中进行zipping和解构for,您最终得到:
train_name:traindataframe 中当前列的名称;test_name:testdataframe 中相应列的名称;train_series和test_series:实际列(作为熊猫系列).第二行:这将检查列是否为类型Object,实质上意味着它包含字符串并且是一个分类列.
第三行:factorize将在第二个位置返回提供列中的唯一值(或分类标签)列表,并在第一个位置返回允许您从唯一值重新创建原始列的索引.换一种说法:
labels, uniques = pd.factorize(column)
for i in range(len(column)):
print(column[i] == uniques[labels[i]]) # True
Run Code Online (Sandbox Code Playgroud)
继续进行解构赋值,当前train列train[train_name]将被其基于索引的表示替换,同时tmp_indexer将包含原始列中的唯一值train[train_name].
第四行:get_indexer将返回要在其中test[test_name]找到值的索引tmp_indexer.结果,当前test列被索引列表替换,其方式与train上面一行中相应列完全相同.
最终的结果:两个柱中train和test从一系列字符串(分类值),以一系列数字索引值中的已经走了,这两个相同的(临时的)对象上的索引.