力扣pandas 每日一题1050 grouped.fliter(lambda)
·
一、题目
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'])
-
subset(可选)指定需要判断重复的列,默认判断所有列。例如:df.drop_duplicates(subset=['actor_id', 'director_id'])只会根据这两列判断是否重复,其他列不同不影响判定。 -
keep(可选,默认'first')控制保留最新/最旧重复记录:keep='first':保留第一次出现的记录,删除后面的重复项(默认)keep='last':保留最后一次出现的记录,删除前面的重复项keep=False:删除所有重复项,不保留任何一条
-
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;
更多推荐


所有评论(0)