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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:31:34