我从互联网上获得了一段代码来分解 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])
我对行test[test_name] = tmp_indexer.get_indexer(test[test_name])特别感兴趣
另外请解释一下,pd.factorize 到底做了什么?它会将字符“A”、“AA”、“AAA”转换为不同的数字因子吗?
请您参考如下方法:
第一行:iteritems 迭代数据框的列并返回(column_name, actual_column) 对。通过 zipping 和 for 行中的解构,您最终得到:
train_name:train数据帧中当前列的名称;test_name:testdataframe中对应列的名称;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 中的两列都从一系列字符串(分类值)变成了一系列数字索引值,都在同一个(临时)对象上建立索引。
