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

如何在已排序的DataFrame中基于其他列创建message列?

实现方法

核心思路

要生成目标message,需先把连续相同的head划分为独立分组(区分同一head的不同批次),再针对每个分组提取信息拼接字符串。

完整代码

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'head': ['Abba As', 'Abba As', 'Abba As', 'Bella Bi', 'Bella Bi', 'Bella Bi', 'Abba As', 'Abba As', 'Abba As'],
    'members': ['Ally', 'Apo', 'Abba', 'Bella', 'Boo', 'Brian', 'Arra', 'Alya', 'Abba']
})

# 1. 给连续相同的head生成分组ID
df['group_id'] = df['head'].ne(df['head'].shift()).cumsum()

# 2. 定义生成message的函数
def build_msg(group):
    full_head = group['head'].iloc[0]
    first_name = full_head.split()[0]
    # 筛选出非head姓名的成员
    guests = group[group['members'] != first_name]['members'].tolist()
    # 格式化成员列表:多成员时用","分隔前几个,最后一个用"和"连接
    guest_str = ', '.join(guests[:-1]) + ' and ' + guests[-1] if len(guests)>=2 else guests[0]
    # 拼接最终字符串
    return f'Hi {first_name}, we invite you, {guest_str}. Please use "{full_head}" when arriving.'

# 3. 分组聚合生成结果
result = df.groupby('group_id').apply(
    lambda g: pd.Series({'head': g['head'].iloc[0], 'message': build_msg(g)})
).reset_index(drop=True)

print(result)

运行结果

head                                                message
0    Abba As  Hi Abba, we invite you, Ally and Apo. Please use "Abba As" when arriving.
1   Bella Bi  Hi Bella, we invite you, Boo and Brian. Please use "Bella Bi" when arriving.
2    Abba As  Hi Abba, we invite you, Arra and Alya. Please use "Abba As" when arriving.

关键细节

  • 连续分组:通过df['head'].ne(df['head'].shift())判断当前行与上一行的head是否不同,cumsum()生成递增的分组ID,确保同一head的非连续批次被分开处理。
  • 成员列表格式化:适配1个或多个成员的情况,保证输出语句符合预期格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:22