Pandas 如何将顺序排名转换为整数分数?
我不熟悉代码,这可能是一个简单的解决方案—— 我在数据集中有3列: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
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