【问题标题】:How do you import a numerically encoded column in pandas?如何在 pandas 中导入数字编码的列?
【发布时间】:2016-09-08 22:19:14
【问题描述】:

我正在导入一个对多个变量进行数字编码的数据集,例如:

SEX
1 - Male
2 - Female

我对如何转换这些的最佳猜测(因此它们在我的数据框中显示为 MaleFemale 而不是数字)是执行以下操作:

df.SEX.replace({1: 'Male', 2: 'Female'}, inplace=True)

是否有更好/更标准的方法来执行此操作(理想情况下,作为我对pd.read_fwf 的调用的一部分或作为许多列的单个函数)- 这是一个相当大的文件,我有很多列要重新-以这种方式编码。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以为此使用categories

    df = pd.DataFrame({"Sex": [1, 2, 1, 1, 2, 1, 2]})
    

    更改数据类型:

    df["Sex"] = df["Sex"].astype("category")
    print(df["Sex"])
    Out[33]: 
    0    1
    1    2
    2    1
    3    1
    4    2
    5    1
    6    2
    Name: Sex, dtype: category
    Categories (2, int64): [1, 2]
    

    重命名类别:

    df["Sex"] = df["Sex"].cat.rename_categories(["Male", "Female"])
    print(df)
    Out[36]: 
          Sex
    0    Male
    1  Female
    2    Male
    3    Male
    4  Female
    5    Male
    6  Female
    

    我在大约 75k 的数据集上进行了尝试(从 beer reviews dataset 中选择评价最多的 30 种啤酒)

    rep_dict = dict(zip(df.beer_name.unique(), range(len(df.beer_name.unique())))) #it constructs a dictionary where the beer names are assigned a number from 0 to 29.
    

    replace 很慢:

    %timeit df["beer_name"].replace(rep_dict)
    10 loops, best of 3: 139 ms per loop
    

    map 比预期更快(因为它会寻找完全匹配的):

    %timeit df["beer_name"].map(rep_dict)
    100 loops, best of 3: 2.78 ms per loop
    

    更改列的类别几乎与map一样多:

    %timeit df["beer_name"].astype("category")
    100 loops, best of 3: 2.57 ms per loop
    

    但是,更改后,类别重命名会更快:

    df["beer_name"] = df["beer_name"].astype("category")
    %timeit df["beer_name"].cat.rename_categories(range(30))
    10000 loops, best of 3: 149 µs per loop
    

    因此,第二个 map 将花费与第一个 map 一样多的时间,但是一旦您更改类别,rename_categories 会更快。 很遗憾,category dtype 在读取文件时无法分配。之后需要更改类型。

    从 0.19.0 版开始,您可以将 dtype='category' 传递给 read_csv(或使用字典指定要解析为类别的列)。 (docs)

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 2021-01-21
      • 2023-03-23
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多