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

如何基于家庭成员参会差异为户主生成格式化通知列

问题描述

我有一个按家庭分组排序的来宾DataFrame(df),家庭成员数量不固定,不同家庭可能有相同户主姓名(比如"abba")。数据结构示例如下:

family fam_head  name    meeting1  meeting2 meeting3  meeting4
0    1     True     abba     1            1      1          1 
1    1              ben      1            1      1          1
2    1              berry                                   1 
3    2              jack     1                              1
4    2     True     joe      1                              1
5    3              razia    1                              1
6    3     True     riri                  1                 
7    4     True     abba    ... 
...

需要为每个户主生成一段符合规范的英文表述:

  • 成员列表用逗号分隔,最后一个名称前加"and"
  • 仅当家庭成员受邀的活动存在差异时,才需要列出对应活动信息
    预期输出示例:
1    abba    Hi abba, delighted for you, ben and berry to come.

             meeting1, meeting2 and meeting 3: abba and ben           (events with same members grouped)
             meeting4: abba, ben and berry

2    joe     Hi joe, delighted for you and jack to come.              (no need to specify events since all members invited to same meetings)
                                                         

3    riri    Hi riri, delighted for you and razia to come.
             
             meeting1 and meeting 4: razia
             meeting2: riri

4   abba     Hi abba, ...
实现方案

可以通过分组处理每个家庭的数据,再按规则生成目标文本,具体步骤如下:

1. 写两个辅助函数格式化文本

先搞两个实用小函数,把列表转成符合英文表达规范的格式:

def format_names(names):
    """把名称列表转成英文规范格式,比如["a","b","c"] → "a, b and c" """
    if len(names) == 1:
        return names[0]
    elif len(names) == 2:
        return f"{names[0]} and {names[1]}"
    else:
        return ", ".join(names[:-1]) + f" and {names[-1]}"

def format_events(events):
    """活动列表的格式化逻辑和名称一致"""
    return format_names(events)

2. 按家庭分组处理数据

对DataFrame按family字段分组,逐个处理每个家庭的信息:

import pandas as pd

# 先提取所有会议列(所有以meeting开头的列)
meeting_cols = [col for col in df.columns if col.startswith("meeting")]

# 存储最终结果
result = []

for family_id, group in df.groupby("family"):
    # 取出户主信息
    head_row = group[group["fam_head"] == True].iloc[0]
    head_name = head_row["name"]
    # 获取当前家庭所有成员的名字
    all_members = group["name"].tolist()
    
    # 生成开头问候语:把户主名字替换成"you"
    member_list_for_greeting = [name if name != head_name else "you" for name in all_members]
    greeting = f"Hi {head_name}, delighted for {format_names(member_list_for_greeting)} to come."
    
    # 判断是否需要生成活动详情:检查所有成员的参会情况是否完全一致
    member_attendance = group.apply(lambda row: tuple(row[meeting_cols].values), axis=1).tolist()
    if len(set(member_attendance)) == 1:
        # 所有成员参会情况相同,不需要活动详情
        result.append((family_id, head_name, greeting))
    else:
        # 参会情况有差异,按"参会成员"分组,合并相同参会成员的活动
        event_to_members = {}
        for event in meeting_cols:
            # 获取该活动的参会成员
            attendees = group[group[event] == 1]["name"].tolist()
            # 把参会成员排序后转成元组,作为合并活动的键
            attendees_key = tuple(sorted(attendees))
            if attendees_key not in event_to_members:
                event_to_members[attendees_key] = []
            event_to_members[attendees_key].append(event)
        
        # 生成活动详情文本
        event_details = []
        for attendees, events in event_to_members.items():
            event_str = format_events(events)
            attendee_str = format_names(list(attendees))
            event_details.append(f"             {event_str}: {attendee_str}")
        
        # 拼接问候语和活动详情
        full_text = f"{greeting}\n\n" + "\n".join(event_details)
        result.append((family_id, head_name, full_text))

# 把结果转成DataFrame(按需使用)
result_df = pd.DataFrame(result, columns=["family", "fam_head_name", "message"])

3. 最终输出

运行代码后,result_df的message列就是每个户主对应的目标文本,格式和预期示例一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:53:14