Skip to main content
 首页 » 编程设计

python之分解 Pandas 数据框的列

2025年05月04日14zhwl

我从互联网上获得了一段代码来分解 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: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 中的两列都从一系列字符串(分类值)变成了一系列数字索引值,都在同一个(临时)对象上建立索引。