【问题标题】:factorize columns of a pandas data frame分解熊猫数据框的列
【发布时间】:2016-03-14 14:31:51
【问题描述】:

我从互联网上获得了一段代码来分解熊猫数据框的分类列,但由于我是 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])

我对@9​​87654324@这一行特别感兴趣

另外请解释一下,pd.factorize 到底是做什么的?它是否将字符“A”、“AA”、“AAA”转换为不同的数字因子?

【问题讨论】:

    标签: python for-loop pandas


    【解决方案1】:

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

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

    第二行:检查列是否为Object 类型,本质上意味着它包含字符串并且是分类列。

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

    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_indexer 中找到的索引。结果,当前的test 列被索引列表替换,其方式与上一行中对应的train 列完全相同。

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

    【讨论】:

    • zip 函数同时迭代两件事吗?它可以用来同时迭代任何x 事物吗?
    • 是的:例如 zip(["a", "b"], [1, 2]) = [("a", 1), ("b", 2)]。
    • 就像拉链一样,它将两个列表拉在一起。
    • 除了描述之外,最好包含整个脚本?
    猜你喜欢
    • 2022-01-12
    • 2018-01-04
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2019-08-01
    • 2013-04-03
    相关资源
    最近更新 更多