DataFrame最后一行Medium/Minimum Rating列转换失败,求排查原因
问题描述
我需要对字母评级进行排名,生成特定格式的最小排名与中位数评级。目前已将大部分行的最小排名和中位数评级转换为正确格式,但这两列的最后一行未成功转换,请求排查原因。
背景与代码实现
- 读取CSV创建DataFrame:
import pandas as pd import numpy as np df = pd.read_csv('csv path', usecols=['rating1','rating2','rating3'])
初始DataFrame结构:
| rating1 | rating2 | rating3 | |
|---|---|---|---|
| 0 | D | Dd | c |
| 1 | C | Bb | A |
| 2 | B | Bb | b |
- 定义映射字典:
# 字母转数值排名 ranking = { 'D': 1, 'Dd': 1, 'd': 1, 'C':2, 'Cc': 2, 'c': 2, 'B': 3, 'Bb': 3, 'b':3, 'A' : 4 } # 数值排名转回字母 rating1_rank = { 1: 'D', 2: 'C', 3: 'B', 4: 'A' }
- 生成评级列的逻辑:
df['Medium_Rating'] = np.where(df.replace(ranking).nunique(axis=1).isin([1,2]), df.replace(ranking).min(axis=1), df.replace(ranking).median(axis=1)) df['Minimum_Rating'] = df.replace(ranking).min(axis=1)
- 尝试转换数值为字母的代码:
df[:-1] = df.replace(rating1_rank) df[:-2] = df.replace(rating1_rank)
实际错误结果
最后一行的Medium_Rating和Minimum_Rating仍为数值3,未转换为字母B:
| rating1 | rating2 | rating3 | medium_rating | minimum_rating | |
|---|---|---|---|---|---|
| 0 | D | Dd | c | D | D |
| 1 | C | Bb | A | B | C |
| 2 | B | Bb | b | 3 | 3 |
问题原因与解决方案
原因分析
你使用的df[:-1]和df[:-2]切片逻辑存在问题:
df[:-1]代表选取除最后一行之外的所有行,直接跳过了最后一行的转换操作df[:-2]代表选取除最后两行之外的所有行,这一步甚至会覆盖第二行的转换结果
这就导致最后一行的数值评级始终没有被映射回字母格式。
解决方案
直接对目标列执行全局替换,或者在生成评级列时一步完成数值到字母的转换:
方案1:针对目标列全局替换
# 单独替换Medium_Rating和Minimum_Rating列的数值为字母 df['Medium_Rating'] = df['Medium_Rating'].map(rating1_rank) df['Minimum_Rating'] = df['Minimum_Rating'].map(rating1_rank)
方案2:生成评级列时直接转换
先计算数值形式的评级,立刻用map转换为字母,避免事后操作:
# 先统一转换为数值评级DataFrame,避免重复计算 num_df = df.replace(ranking) # 生成Medium_Rating并直接转换为字母 df['Medium_Rating'] = np.where(num_df.nunique(axis=1).isin([1,2]), num_df.min(axis=1), num_df.median(axis=1)).map(rating1_rank) # 生成Minimum_Rating并直接转换为字母 df['Minimum_Rating'] = num_df.min(axis=1).map(rating1_rank)
两种方案都能确保所有行(包括最后一行)完成数值到字母的转换,得到预期结果。
内容的提问来源于stack exchange,提问作者bananas
相关产品推荐
相关产品推荐

