如何在Pandas DataFrame字符串列中提取最高占比人员信息?
解决方案:从Pandas字符串列提取占比最高的人员信息
假设你的name_percentage列格式类似"张三:30%,李四:50%,王五:20%",可以通过自定义处理函数+批量apply解决问题,具体步骤如下:
1. 构造示例数据集
先模拟你提到的数据集:
import pandas as pd data = { "id": [1, 2, 3], "name_percentage": [ "张三:30%,李四:50%,王五:20%", "赵六:45%,孙七:55%", "周八:10%,吴九:60%,郑十:30%" ] } df = pd.DataFrame(data)
2. 定义单条字符串处理函数
这个函数负责拆分字符串、提取姓名与占比数值,最终返回占比最高的条目:
def extract_top_person(s): # 分割成单个人员的占比条目 items = s.split(",") person_info = [] for item in items: # 拆分姓名和占比字符串 name, pct_str = item.split(":") # 去除百分号并转换为数值类型 pct = float(pct_str.replace("%", "")) person_info.append((name, pct)) # 按占比降序排序,取第一个结果 person_info.sort(key=lambda x: x[1], reverse=True) return person_info[0] if person_info else (None, None)
3. 批量处理并新增目标列
用apply将函数作用到整个列,再把结果拆分成两列:
# 生成包含姓名和占比的元组列 df["top_person"] = df["name_percentage"].apply(extract_top_person) # 拆分元组为独立的两列 df[["best_name", "percentage"]] = pd.DataFrame(df["top_person"].tolist(), index=df.index) # 可选:删除中间生成的临时列 df.drop("top_person", axis=1, inplace=True)
最终结果
处理后的DataFrame会新增best_name和percentage列,展示每行占比最高的人员信息:
id name_percentage best_name percentage 0 1 张三:30%,李四:50%,王五:20% 李四 50.0 1 2 赵六:45%,孙七:55% 孙七 55.0 2 3 周八:10%,吴九:60%,郑十:30% 吴九 60.0
补充说明
- 如果你的
name_percentage列格式有变体(比如分隔符不是逗号/冒号),只需调整函数里的split参数即可适配。 - 若存在多名人员占比相同且均为最高值的情况,当前函数会返回排序后的第一个条目,你可以根据需求修改排序逻辑(比如保留所有最高项)。
内容的提问来源于stack exchange,提问作者Jresearcher
相关产品推荐
相关产品推荐

