【问题标题】:Python_Pandas: Among duplicate columns, choose the column with the most recent date AND THEN choose the one with maximum scorePython_Pandas:在重复的列中,选择日期最近的列,然后选择得分最高的列
【发布时间】:2017-03-29 01:54:24
【问题描述】:
import pandas as pd 
import numpy as np
#Create sample df with following columns; iP,date,score,appOwner,color
df = pd.DataFrame(
                {"iP":['111.11.111.112', '111.11.111.113', '111.11.111.112', '111.11.111.112', '111.11.111.113', '111.11.111.113', '111.11.111.114', '111.11.111.114', '111.11.111.114'],
                 "date":['2016-4-3', '2016-4-2', '2016-4-2', '2016-4-5', '2016-4-3', '2016-4-2', '2016-4-3', '2016-4-3', '2016-4-1'],
                 "score":[9, 8, 8, 10, 6, 7, 7, 7, 6],
                 "appOwner":['John','Andrew','Adam','John','Andrew','Adam','Park','Doe','Jason'],
                 "color":['Green','Yellow','Unknown','Red','White','Green','Red','Yellow','Red']
                })
#Chage df['date'] dtype to datetime 
df['date'] = pd.to_datetime(df['date'], format="%Y-%m-%d")

df

任务说明

在重复的 IP 中,选择最近的“日期”,然后选择得分最高(较高)的“iP”。 上面正确完成时所需的输出在下面,

ip              date         score
111.11.111.112   2016-4-5     10
111.11.111.113   2016-4-3     6
111.11.111.114   2016-4-3     7 

我尝试过的

foo = df.groupby(['iP','date'])
bar = foo['score'].agg({'maxScore':np.max})
bar
                            maxScore
iP              date    
111.11.111.112  2016-04-02  8
                2016-04-03  9
                2016-04-05  10
111.11.111.113  2016-04-02  8
                2016-04-03  6
111.11.111.114  2016-04-01  6
                2016-04-03  7

我知道到目前为止我所尝试的方法并不能解决这个任务。 通过least_recent_date = df['date'].min() recent_date = df['date'].max(),我可以获得最近和最近的日期,但这仍然不能一次性解决任务。 任何帮助将不胜感激!!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我使用idxmax 来识别最大值的位置。这样可以更轻松地将其他相关数据保留在同一行中。

    所以ndf 将是df 的子集,其中每一行都包含score,这是['iP', 'date'] 组合中的最大值。然后在该子集中,我再次确定哪些行包含每个iP 的最新或最大date。最后,我用['iP', 'date', 'score'] 分割结果。

    请记住,这只是给这只猫剥皮的一种方法。

    ndf = df.loc[df.groupby(['iP', 'date']).score.idxmax()]
    ndf.loc[ndf.groupby(['iP']).date.idxmax(), ['iP', 'date', 'score']]
    
                   iP       date  score
    3  111.11.111.112 2016-04-05     10
    4  111.11.111.113 2016-04-03      6
    6  111.11.111.114 2016-04-03      7
    

    【讨论】:

    • 看起来操作顺序倒转了。
    • @gereleth 我同意。我无法协调最近的日期和 OP 获得的数字。我觉得一定是错的。我选择使用最新数据并假设预期输出不正确。
    • @piRSquared 正确,对于不正确的预期输出,我深表歉意。我相应地改变了它。我认为这可行,现在尝试了解您的解决方案。这将是我今天的作业,我已经更新了你。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2014-09-17
    • 2022-01-05
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多