You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:29:19