基于另一列连续值拼接Pandas DataFrame列字符串的实现方法
给FD关联对应的MS值生成结果列的解决方案
嘿,我来帮你搞定这个Pandas需求!你需要把每个FD对应的所有MS的col2值整理到结果列里,对吧?下面是两种实用的实现方法,一步步来:
方法一:分步分组聚合(清晰易懂)
1. 给每个FD-MS组打上唯一标识
首先,我们可以通过判断col1是否为FD,然后累加这个布尔值,给每个FD和它后续的MS分配同一个分组ID:
import pandas as pd dict_obj = {'col1': ['FD', 'MS', 'MS', 'FD', 'MS', 'MS', 'MS', 'FD', 'MS', 'MS'], 'col2': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']} df = pd.DataFrame(dict_obj) # 每遇到一个FD,分组ID就加1,这样同组的FD和MS会有相同的ID df['group_id'] = (df['col1'] == 'FD').cumsum()
2. 收集每组内的MS值
接下来,我们按分组ID聚合,把每组里所有MS的col2值收集成列表:
# 只筛选MS行,按group_id分组后把col2转成列表 ms_groups = df[df['col1'] == 'MS'].groupby('group_id')['col2'].agg(list).reset_index(name='result')
3. 把结果合并回原DataFrame
最后把聚合好的结果合并回去,这样每个FD和对应的MS行都能关联到该组的MS列表:
df = df.merge(ms_groups, on='group_id', how='left') # 如果只希望FD行显示结果,MS行留空的话,加上这一行 df.loc[df['col1'] == 'MS', 'result'] = None
运行完之后,你的DataFrame会变成这样:
| col1 | col2 | group_id | result | |
|---|---|---|---|---|
| 0 | FD | A | 1 | ['B', 'C'] |
| 1 | MS | B | 1 | NaN |
| 2 | MS | C | 1 | NaN |
| 3 | FD | D | 2 | ['E', 'F', 'G'] |
| 4 | MS | E | 2 | NaN |
| 5 | MS | F | 2 | NaN |
| 6 | MS | G | 2 | NaN |
| 7 | FD | H | 3 | ['I', 'J'] |
| 8 | MS | I | 3 | NaN |
| 9 | MS | J | 3 | NaN |
方法二:用transform一步搞定(更简洁)
如果想要更紧凑的代码,可以用transform方法直接在原DataFrame上生成结果列:
import pandas as pd dict_obj = {'col1': ['FD', 'MS', 'MS', 'FD', 'MS', 'MS', 'MS', 'FD', 'MS', 'MS'], 'col2': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']} df = pd.DataFrame(dict_obj) # 分组后提取每组内MS的col2值作为结果 df['result'] = df.groupby((df['col1'] == 'FD').cumsum())['col2'].transform( lambda x: x[x.index.isin(df[df['col1'] == 'MS'].index)].tolist() ) # 同样可以选择清空MS行的结果 df.loc[df['col1'] == 'MS', 'result'] = None
这个方法的核心思路和第一种一样:用cumsum生成分组键,把每个FD和后续MS归为一组,然后提取组内的MS值作为结果列内容。
内容的提问来源于stack exchange,提问作者Praneeth Krishna
相关产品推荐
相关产品推荐

