Pandas 如何将顺序排名转换为整数分数?

Pandas 如何将顺序排名转换为整数分数?,pandas,dataframe,Pandas,Dataframe,我不熟悉代码,这可能是一个简单的解决方案—— 我在数据集中有3列: age_bridges.Deck_rating age_bridges.Supstr_rating age_bridges.Substr_rating 评级从失败到失败依次排列。。。很好,很好 我想为每一列分配一个1-6的整数,从失败到优秀,然后分配一个名为“条件”的新列,这是三个分数的总和。有什么建议吗 以下是输入: condition = age_bridges.Deck_rating, age_bridges.Super

我不熟悉代码,这可能是一个简单的解决方案——

我在数据集中有3列:

age_bridges.Deck_rating
age_bridges.Supstr_rating
age_bridges.Substr_rating
评级从失败到失败依次排列。。。很好,很好

我想为每一列分配一个1-6的整数,从失败到优秀,然后分配一个名为“条件”的新列,这是三个分数的总和。有什么建议吗

以下是输入:

condition = age_bridges.Deck_rating, age_bridges.Superstr_rating, age_bridges.Substr_rating

print(condition)
输出:


(Structure_id
 000021521-00101         Good
 000021521-00181         Good
 000021521-TMP20    Very Good
 000021525-00012         Good
 000021580-00092         Good
                      ...    
 DAPFORHOO000012         Good
 DAPFORHOO000013         Good
 DAPFORHOO000015         Good
 DAPFORHOO00005A         Good
 DAPTRABLI000011         Good
 Name: Deck_rating, Length: 34293, dtype: category
 Categories (11, object): [Failed < Failing < Critical < Serious ... Good < Very Good < Excellent < NA],
 Structure_id
 000021521-00101    Very Good
 000021521-00181         Good
 000021521-TMP20    Very Good
 000021525-00012         Good
 000021580-00092    Very Good
                      ...    
 DAPFORHOO000012         Good
 DAPFORHOO000013         Good
 DAPFORHOO000015         Good
 DAPFORHOO00005A         Good
 DAPTRABLI000011    Very Good
 Name: Superstr_rating, Length: 34293, dtype: category
 Categories (11, object): [Failed < Failing < Critical < Serious ... Good < Very Good < Excellent < NA],
 Structure_id
 000021521-00101       Very Good
 000021521-00181       Very Good
 000021521-TMP20       Very Good
 000021525-00012            Poor
 000021580-00092       Very Good
                        ...     
 DAPFORHOO000012            Good
 DAPFORHOO000013            Good
 DAPFORHOO000015            Good
 DAPFORHOO00005A    Satisfactory
 DAPTRABLI000011            Good
 Name: Substr_rating, Length: 34293, dtype: category
 Categories (11, object): [Failed < Failing < Critical < Serious ... Good < Very Good < Excellent < NA])


为此,您可以采取两种主要方法:

  • 使用
    .map
    将列值转换为数字表示
  • 将列更改为pd.Category系列
设置数据:

import pandas as pd
import numpy as np
np.random.seed(0)

ordered_ratings = ["failed", "failing", "fine", "good", "excellent"]

df = pd.DataFrame({
    "ranking": np.random.choice(ordered_ratings, 10)
})

print(df)
     ranking
0  excellent
1     failed
2       good
3       good
4       good
5    failing
6       good
7       fine
8  excellent
9     failed
地图法 映射方法提供了一种1对1的方式,将一系列值交换为新值。这可以通过字典轻松完成,其中您只需要{old_value:new_value}的映射

所以首先我们需要创建一个映射{“failed”:1,“failed”:2,…,“excellent”:5}的字典

那很好

pd.分类方法 另一种方法是使用分类数列,将你的评级名称与其对应的数字排名联系起来。基本上,您可以告诉pandas,您的值实际上是数字排名,它们的字符串值仅用于查看/阅读目的。这使您可以在需要时使用数值,同时还可以保持在对象数据类型上具有整数数据类型的列的良好性能

pd.category
获取相关列、我们希望在该列中看到的唯一值,以及一个boolen值,以指示这些唯一值是否有序(在本例中,我们处理的是一组有序的类别)

虽然新列“cat_ratings”看起来可能与我们原来的列相同,但实际上它是一系列类似于“map_ratings”列的数字(除了此列的范围是0-4,而不是1-5)。如果我们想对基础数字执行任何操作,我们可以从新列的
.cat
访问器访问
代码

print(df["cat_ratings"].cat.codes)
0    4
1    0
2    3
3    3
4    3
5    1
6    3
7    2
8    4
9    0
dtype: int8
现在,您可以轻松地在数据的字符串表示和数字表示之间来回转换数据。同时还可以获得在数字表示上操作的所有性能优势(主要是较小的内存占用)。此外,如果我们按此列排序,它将尊重我们输入的类别顺序(因为我们提供了
order=True
)。因此,分类列可以让您访问一些简洁的特性,同时保持两个方面的最佳效果

有关更多信息,请参阅分类数据的熊猫文档:

有两种方法可以解决这个问题:

  • 使用
    .map
    将列值转换为数字表示
  • 将列更改为pd.Category系列
设置数据:

import pandas as pd
import numpy as np
np.random.seed(0)

ordered_ratings = ["failed", "failing", "fine", "good", "excellent"]

df = pd.DataFrame({
    "ranking": np.random.choice(ordered_ratings, 10)
})

print(df)
     ranking
0  excellent
1     failed
2       good
3       good
4       good
5    failing
6       good
7       fine
8  excellent
9     failed
地图法 映射方法提供了一种1对1的方式,将一系列值交换为新值。这可以通过字典轻松完成,其中您只需要{old_value:new_value}的映射

所以首先我们需要创建一个映射{“failed”:1,“failed”:2,…,“excellent”:5}的字典

那很好

pd.分类方法 另一种方法是使用分类数列,将你的评级名称与其对应的数字排名联系起来。基本上,您可以告诉pandas,您的值实际上是数字排名,它们的字符串值仅用于查看/阅读目的。这使您可以在需要时使用数值,同时还可以保持在对象数据类型上具有整数数据类型的列的良好性能

pd.category
获取相关列、我们希望在该列中看到的唯一值,以及一个boolen值,以指示这些唯一值是否有序(在本例中,我们处理的是一组有序的类别)

虽然新列“cat_ratings”看起来可能与我们原来的列相同,但实际上它是一系列类似于“map_ratings”列的数字(除了此列的范围是0-4,而不是1-5)。如果我们想对基础数字执行任何操作,我们可以从新列的
.cat
访问器访问
代码

print(df["cat_ratings"].cat.codes)
0    4
1    0
2    3
3    3
4    3
5    1
6    3
7    2
8    4
9    0
dtype: int8
现在,您可以轻松地在数据的字符串表示和数字表示之间来回转换数据。同时还可以获得在数字表示上操作的所有性能优势(主要是较小的内存占用)。此外,如果我们按此列排序,它将尊重我们输入的类别顺序(因为我们提供了
order=True
)。因此,分类列可以让您访问一些简洁的特性,同时保持两个方面的最佳效果

有关更多信息,请参阅分类数据的熊猫文档:

请与预期输出共享一个示例输入数据帧。这会让我们明白。如果有帮助的话,我已经编辑了我的问题。你能给我们提供一个输入数据的样本吗?只需使用
print(age_bridges.head(20))
打印几行数据框,将其复制并粘贴到问题中即可完成–感谢您的帮助,因为您似乎已经有了
类别
dtype,这将像
age\u bridges.Deck\u rating.cat.codes那样简单。请与预期输出共享一个示例输入数据帧。这会让我们明白。如果有帮助的话,我已经编辑了我的问题。你能给我们提供一个输入数据的样本吗?只需使用
print(age\u bridges.head(20))
打印几行数据框,将其复制并粘贴到您的问题中即可完成–感谢您的帮助,因为您似乎已经有了
类别
dtype,它将像
age\u bridges.Deck\u rating.cat.code一样简单
print(df["cat_ratings"].cat.codes)
0    4
1    0
2    3
3    3
4    3
5    1
6    3
7    2
8    4
9    0
dtype: int8