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

Pandas:如何将组标题迁移至新列?

解决分组式DataFrame的组-成员映射问题

嘿,我看你现在有个按“分组名+成员”顺序排列的DataFrame,想把每个成员对应到所属的分组里对吧?这其实是个很常见的场景,我来给你一套简单的解决方案。

首先先还原你的初始环境和数据:

import pandas as pd
from IPython.display import display, HTML

# 初始数据
xl = [['group1'], ['john'], ['mike'], ['marry'], ['group2'], ['dan'], ['ann'], ['jacob'], ['susan']]
s = pd.DataFrame(xl)
display(s)

运行后得到的初始DataFrame是这样的:

0
0  group1
1  john
2  mike
3  marry
4  group2
5  dan
6  ann
7  jacob
8  susan

接下来我们来实现把成员映射到对应分组的逻辑,代码如下:

# 先给列起个名字方便操作
s.columns = ['content']

# 标记出所有分组行,并向前填充分组名称到每个成员行
s['group'] = s['content'].where(s['content'].str.contains('group')).ffill()

# 过滤掉原来的分组行,只保留成员和对应的分组,并重命名列
result = s[~s['content'].str.contains('group')].rename(columns={'content': 'member'})

# 调整列顺序,让分组在前,成员在后
result = result[['group', 'member']]

display(result)

运行后你会得到期望的结果:

groupmember
1group1john
2group1mike
3group1marry
5group2dan
6group2ann
7group2jacob
8group2susan

步骤解释:

  • 给列命名:初始DataFrame的列是默认的0,改成content后可读性更强;
  • 标记并填充分组:where方法会把非分组行转为NaN,只保留分组行的内容,再用ffill()(向前填充)把每个成员行都填上最近的分组名称;
  • 过滤与重命名:用~取反过滤掉分组行,只保留成员数据,然后把列名改成member让结果更清晰;
  • 调整列顺序:按需把group列放到前面,让结果结构更直观。

如果你的分组标识不是包含'group',而是其他规则,只需要修改str.contains('group')里的匹配条件就行啦,比如如果分组是大写开头,就改成str.match('^[A-Z]')之类的,灵活调整即可。

内容的提问来源于stack exchange,提问作者Bill Armstrong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:07:40