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()
,我可以获得最新的,最近的日期,但仍然没有完成任务。
任何帮助将不胜感激!!
答案 0 :(得分:2)
我使用idxmax
来确定最大值的位置。这样可以更容易地将其他相关数据保存在同一行中。
因此ndf
将成为df
的子集,其中每一行都包含score
组合中['iP', 'date']
的最大值。然后,在该子集中,我再次确定哪些行包含每个date
的最新或最大iP
。最后,我使用['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