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)
运行后你会得到期望的结果:
| group | member | |
|---|---|---|
| 1 | group1 | john |
| 2 | group1 | mike |
| 3 | group1 | marry |
| 5 | group2 | dan |
| 6 | group2 | ann |
| 7 | group2 | jacob |
| 8 | group2 | susan |
步骤解释:
- 给列命名:初始DataFrame的列是默认的
0,改成content后可读性更强; - 标记并填充分组:
where方法会把非分组行转为NaN,只保留分组行的内容,再用ffill()(向前填充)把每个成员行都填上最近的分组名称; - 过滤与重命名:用
~取反过滤掉分组行,只保留成员数据,然后把列名改成member让结果更清晰; - 调整列顺序:按需把
group列放到前面,让结果结构更直观。
如果你的分组标识不是包含'group',而是其他规则,只需要修改str.contains('group')里的匹配条件就行啦,比如如果分组是大写开头,就改成str.match('^[A-Z]')之类的,灵活调整即可。
内容的提问来源于stack exchange,提问作者Bill Armstrong
相关产品推荐
相关产品推荐

