如何基于家庭成员参会差异为户主生成格式化通知列
问题描述
我有一个按家庭分组排序的来宾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
相关产品推荐
相关产品推荐

