如何在已排序的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
相关产品推荐
相关产品推荐

