在R中基于多排名列提取用户最爱的游戏平台
嘿,这个需求很常见,我给你准备了Python(Pandas)和R(Tidyverse)两种主流工具的实现方案,你按需选用就行~
Python (Pandas) 实现方法
核心思路:定位每行中值为1的列名,再去掉列名末尾的rank后缀,得到对应的主机名称
- 高效简洁版(适合大数据量):
import pandas as pd # 假设你的数据框已经加载为df df['favorite_console'] = df.idxmin(axis=1).str.replace('rank', '')
解释:idxmin(axis=1)会直接返回每行最小值(也就是排名1)对应的列名,再用str_replace去掉末尾的rank,一步到位生成目标列。
- 直观易懂版(适合新手理解逻辑):
import pandas as pd def get_favorite_host(row): # 找到当前行中值为1的列名 target_col = row[row == 1].index[0] # 去掉列名里的"rank"后缀 return target_col.replace('rank', '') df['favorite_console'] = df.apply(get_favorite_host, axis=1)
解释:自定义函数逐行处理,逻辑清晰,哪怕是刚接触Pandas的人也能快速看懂。
R (Tidyverse) 实现方法
核心思路:可以选择用管道流的宽转长方式处理(便于后续扩展分析),或者直接逐行匹配
- 管道流风格(推荐,适合后续数据分析):
library(tidyverse) df <- df %>% # 先给每行添加唯一用户ID,方便后续合并 mutate(user_id = row_number()) %>% # 把宽格式数据转成窄格式,拆分出主机名和对应排名 pivot_longer(cols = -user_id, names_to = "console", values_to = "rank") %>% # 筛选出排名为1的记录 filter(rank == 1) %>% # 去掉主机名里的"rank"后缀 mutate(console = str_remove(console, "rank")) %>% # 合并回原数据框 right_join(df %>% mutate(user_id = row_number()), by = "user_id") %>% # 整理列名和顺序 rename(favorite_console = console) %>% select(-user_id, -rank)
- 快速简洁版(适合快速完成需求):
library(stringr) df$favorite_console <- apply(df, 1, function(row) { # 找到值为1的列名,去掉"rank"后缀 str_remove(names(row)[row == 1], "rank") })
注意事项
- 请确保每行只有一个值为1的记录(即每个用户仅选择了一台最偏好的主机),如果存在多行多1的情况,需要先检查数据录入是否有误,否则代码可能报错或返回异常结果。
- 如果列名的后缀不是统一的
rank,请调整字符串替换的规则(比如用正则表达式匹配结尾的排名标识)。
内容的提问来源于stack exchange,提问作者oracle_randy
相关产品推荐
相关产品推荐

