伪编辑科学家 2024-10-17 21:48 采纳率: 16.7%
浏览 7

力扣 关于pandas分组聚合的问题

https://leetcode.cn/problems/game-play-analysis-ii/

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id, event_date) 是这个表的两个主键(具有唯一值的列的组合)
这个表显示的是某些游戏玩家的游戏活动情况
每一行是在某天使用某个设备登出之前登录并玩多个游戏(可能为0)的玩家的记录
请编写解决方案,描述每一个玩家首次登陆的设备名称

返回结果格式如以下示例:

 

示例 1:

输入:
Activity table:
+-----------+-----------+------------+--------------+
| player_id | device_id | event_date | games_played |
+-----------+-----------+------------+--------------+
| 1         | 2         | 2016-03-01 | 5            |
| 1         | 2         | 2016-05-02 | 6            |
| 2         | 3         | 2017-06-25 | 1            |
| 3         | 1         | 2016-03-02 | 0            |
| 3         | 4         | 2018-07-03 | 5            |
+-----------+-----------+------------+--------------+
输出:
+-----------+-----------+
| player_id | device_id |
+-----------+-----------+
| 1         | 2         |
| 2         | 3         |
| 3         | 1         |
+-----------+-----------+

在用pandas刷力扣的时候遇到了,这是一道分组聚合的题,我的思路是这样的:

import pandas as pd

def game_analysis(activity: pd.DataFrame) -> pd.DataFrame:
    #将原数据集的event_date列分组后进行最小值聚合
    activity['event_date']=activity.groupby('player_id').agg({'event_date':'min'})
    #按行删除聚合后event_date列为空的数据
    activity=activity.dropna(axis=0).reset_index(drop=True)
    #返回要求的数据
    return activity[['player_id','device_id']]

我不太明白这种聚合的方式为什么不正确,请各位解答一下,感激不尽

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-17 21:49
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的思路基本上是正确的,但是有一点需要注意,你在对 event_date 进行分组聚合的时候,应该使用 min 函数来获取每个玩家的最早游戏日期,而不是对整个 event_date 列进行分组聚合。然后你需要找到与最早游戏日期对应的设备ID。以下是修正后的代码:

    import pandas as pd
    
    def game_analysis(activity: pd.DataFrame) -> pd.DataFrame:
        # 找到每个玩家的最早游戏日期
        min_dates = activity.groupby('player_id')['event_date'].min().reset_index()
        min_dates.columns = ['player_id', 'min_event_date']  # 重命名列名以便后续操作
        
        # 找到与最早游戏日期对应的设备ID
        result = pd.merge(min_dates, activity, on=['player_id', 'event_date'], how='left')
        result = result[['player_id', 'device_id']]  # 选择需要的列
        
        return result.drop_duplicates()  # 去除重复的行
    

    这样你就能得到每个玩家首次登录的设备名称了。这里使用了 pd.merge 函数来合并数据,然后通过选择需要的列来得到最终结果。注意使用 drop_duplicates 来去除可能的重复行,确保每个玩家只出现一次。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月17日