使用Pandas转换Playwright爬取的用户组管理员数据格式求助
用Pandas转换管理员表格格式的实现方案
直接上代码和步骤,对应你的需求:
1. 模拟初始数据(替换成你爬取到的DataFrame)
先构造和你爬取结果一致的示例数据,方便你对照:
import pandas as pd # 你爬取到的初始表格结构:姓名为行,各组为列,"A"表示管理员 raw_data = { "姓名": ["张三", "李四", "王五"], "市场组": ["A", "", "A"], "技术组": ["", "A", "A"], "运营组": ["A", "A", ""] } df = pd.DataFrame(raw_data)
2. 转换步骤
第一步:将宽表转长表
把原来的列(各组)转成行数据,保留姓名和管理员标记:
# 拆解表格,得到「姓名-组名-是否管理员」的长格式数据 melted_df = df.melt(id_vars="姓名", var_name="组名", value_name="管理员标记")
第二步:筛选管理员记录
只保留标记为"A"的行,去掉无用的标记列:
admin_only = melted_df[melted_df["管理员标记"] == "A"].drop(columns="管理员标记")
第三步:按组聚合管理员姓名
把每个组对应的所有管理员姓名收集起来:
# 按组名分组,将姓名转为列表 grouped_admins = admin_only.groupby("组名")["姓名"].apply(list).reset_index()
第四步:展开列表为多列
把每个组的管理员列表拆分成独立列,列名设为「管理员1」「管理员2」这类:
# 将列表拆分为多列 final_df = pd.DataFrame(grouped_admins["姓名"].tolist(), index=grouped_admins["组名"]).reset_index() # 重命名列 final_df.columns = ["组名"] + [f"管理员{i+1}" for i in range(final_df.shape[1]-1)]
3. 最终效果
运行后final_df的结构就是你要的:
| 组名 | 管理员1 | 管理员2 |
|---|---|---|
| 市场组 | 张三 | 王五 |
| 技术组 | 李四 | 王五 |
| 运营组 | 张三 | 李四 |
如果某个组的管理员数量少于最大数量,空值会显示NaN,可以用final_df.fillna("")把空值替换成空字符串。
特殊情况处理
如果你的初始数据是把姓名设为索引的(比如爬取后直接用姓名当行索引),先执行df = df.reset_index().rename(columns={"index": "姓名"})把姓名转成普通列再按上面的步骤处理。
内容的提问来源于stack exchange,提问作者Dinerz
相关产品推荐
相关产品推荐

