一、题目

ActorDirector 表:

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| actor_id    | int     |
| director_id | int     |
| timestamp   | int     |
+-------------+---------+
timestamp 是这张表的主键(具有唯一值的列).

编写解决方案找出合作过至少三次的演员和导演的 id 对 (actor_id, director_id)

示例 1:

输入:
ActorDirector 表:
+-------------+-------------+-------------+
| actor_id    | director_id | timestamp   |
+-------------+-------------+-------------+
| 1           | 1           | 0           |
| 1           | 1           | 1           |
| 1           | 1           | 2           |
| 1           | 2           | 3           |
| 1           | 2           | 4           |
| 2           | 1           | 5           |
| 2           | 1           | 6           |
+-------------+-------------+-------------+
输出:
+-------------+-------------+
| actor_id    | director_id |
+-------------+-------------+
| 1           | 1           |
+-------------+-------------+
解释:
唯一的 id 对是 (1, 1),他们恰好合作了 3 次。

二、知识点

1、groupby多列分组(层次化索引

# 按 col1、col2 依次分组
grouped = df.groupby([col1, col2, ...])

        多列分组后,可以像单列分组一样使用 agg()apply()filter() 等方法,操作会作用于最内层的每个子组。

使用场景:

a、组合条件聚合:按多个维度统计数据时(如 “按地区 + 年份” 统计销售额)。

b、复杂关系分析:分析多因素之间的关联(如本文案例中 “演员 - 导演” 的合作关系)。

c、分层筛选:先按大类分组,再在小类中筛选(如 “先按部门分组,再在每个部门内按职位筛选出人数≥5 的职位”)。

2、过滤(filter()

根据分组的统计量筛选分组,注意是保留满足条件的组的所有原始数据行!需要用.drop_duplicates()去重。

3、drop_duplicates()

删除 DataFrame 或 Series 中重复行的方法,用于保留唯一记录。

用法:

# 对整个 DataFrame 去重
df.drop_duplicates()

# 对指定列去重(只考虑这些列的重复情况)
df.drop_duplicates(subset=['列1', '列2'])
  1. subset(可选)指定需要判断重复的列,默认判断所有列。例如:df.drop_duplicates(subset=['actor_id', 'director_id']) 只会根据这两列判断是否重复,其他列不同不影响判定。

  2. keep(可选,默认 'first')控制保留最新/最旧重复记录:

    • keep='first':保留第一次出现的记录,删除后面的重复项(默认)
    • keep='last':保留最后一次出现的记录,删除前面的重复项
    • keep=False:删除所有重复项,不保留任何一条
  3. inplace(可选,默认 False)是否在原 DataFrame 上修改:

    • inplace=True:直接修改原数据,不返回新对象
    • inplace=False:返回去重后的新 DataFrame,原数据不变

三、答案

def actors_and_directors(actor_director: pd.DataFrame) -> pd.DataFrame:
    grouped=actor_director.groupby(['actor_id','director_id'])
    result_=grouped.filter(lambda x:len(x)>=3)[['actor_id', 'director_id']]
    result=result_.drop_duplicates()
    return result
def find_actor_director_pairs(actor_director_df):
    # 按演员ID和导演ID分组,并计算每组的数量
    collaboration_counts = actor_director_df.groupby(['actor_id', 'director_id']).size().reset_index(name='counts')
    
    # 筛选出合作次数不少于3的组合
    result = collaboration_counts[collaboration_counts['counts'] >= 3][['actor_id', 'director_id']]
    
    return result
SELECT actor_id, director_id
FROM ActorDirector
GROUP BY actor_id, director_id
HAVING COUNT(*) >= 3;

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐