基于Pandas计算好友关系与派对出席的关联及在场好友均值
解决Pandas计算派对出席时在场好友平均数量的问题
示例数据构造
先还原你提到的两个DataFrame构造代码:
import pandas as pd # 双向好友关系表 df1 df1 = pd.DataFrame({ 'friend1': ['Alice', 'Bob', 'Alice', 'Charlie', 'David'], 'friend2': ['Bob', 'Alice', 'Charlie', 'Alice', 'Frank'] }) # 派对出席记录表 df2 df2 = pd.DataFrame({ 'person': ['Alice', 'Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'date': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-02', '2024-01-03', '2024-01-03'] })
分步解决方案
1. 整理完整的好友关系映射
因为df1是双向记录(比如Alice-Bob和Bob-Alice都存在),先统一格式并去重,生成每个人的好友集合:
# 合并正反方向的好友对,避免重复计算 friends_combined = pd.concat([ df1.rename(columns={'friend1': 'person', 'friend2': 'friend'}), df1.rename(columns={'friend2': 'person', 'friend1': 'friend'}) ]).drop_duplicates() # 按人员分组,聚合好友列表为集合(方便快速交集计算) friend_map = friends_combined.groupby('person')['friend'].apply(set).to_dict()
2. 生成每场派对的出席人员集合
按日期分组,记录每个日期在场的所有人:
party_attendees = df2.groupby('date')['person'].apply(set).to_dict()
3. 计算单场派对的在场好友数
遍历df2的每一条出席记录,统计当前人员的好友中当天在场的数量:
def get_present_friends(row): # 获取当前人员的好友集合,无好友则为空集合 my_friends = friend_map.get(row['person'], set()) # 获取当天派对的出席人员集合 today_people = party_attendees.get(row['date'], set()) # 计算交集的长度,即在场好友数 return len(my_friends & today_people) # 给df2添加在场好友数字段 df2['present_friends'] = df2.apply(get_present_friends, axis=1)
4. 计算每个人的在场好友数平均值
按人员分组求均值,同时处理无出席记录、无好友的情况(统一设为0):
# 计算已有出席记录人员的平均值 avg_friends = df2.groupby('person')['present_friends'].mean().reset_index() avg_friends = avg_friends.rename(columns={'present_friends': 'avg_present_friends'}) # 收集所有出现过的人员(包括没参加派对或没好友的) all_people = pd.Series( list(set(df1.stack()).union(set(df2['person']))), name='person' ) # 合并并填充缺失值为0 final_result = all_people.merge(avg_friends, on='person', how='left').fillna(0)
最终结果
运行print(final_result)会得到:
person avg_present_friends 0 Alice 1.0 1 Bob 1.0 2 Charlie 1.0 3 David 0.0 4 Frank 0.0 5 Eve 0.0
解释:
- Alice参加2场派对,每场都有1位好友在场,平均1.0
- Bob只参加1场,当天Alice在场,平均1.0
- David的好友Frank没参加任何派对,所以他出席的那场无好友在场,平均0.0
- Frank没参加派对、Eve无好友,均值都为0
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

