我有一个类似于下面的pandas数据框,它具有混合列数据类型(字符串,数据时间,整数),我想要做的是过滤行以按Company和Model组合的日期获得最后一条记录。
我已经在许多过滤/ groupby解决方案中进行搜索,我能够获得的是我需要的行,但缺少许多列(请参阅下面的groupby)。我已经读过有关熊猫中列的麻烦的信息,我尝试使用groupby生成可在原始数据帧中使用的掩码,但失败了。我不知道如何继续获得相同的结果,但使用所有原始列。
DateTime, units
2019-04-04 13:44:48, 15
2019-04-05 13:44:49, 95
2019-04-09 13:44:53, 17
2019-04-10 13:44:53, 54
2019-04-18 13:44:53, 85
2019-04-19 13:44:53, 28
2019-04-20 13:44:53, 20
data = {'Company': ['Mercedes', 'Fiat', 'Ferrari', 'Mercedes', 'Volkswagen'],
'Model': ['Class A', 'Punto', 'GTO', 'Class A', 'Polo'],
'User': ['Mario', 'Paolo', 'Filippo', 'Andrea', 'Giuseppe'],
'Rented on': ['2017-04-02', '2017-05-01', '2017-05-22', '2017-08-01', '2017-08-02'],
'Kms': [2200, 3000, 110, 2400, 3000]
}
df = pd.DataFrame(data)
print df.groupby(['Company', 'Model'])['Rented on'].last().reset_index()
答案 0 :(得分:1)
您可以将transform
与boolean indexing
一起使用:
df[df['Rented on'].eq(df.groupby(['Company', 'Model'])['Rented on'].transform('last'))]
Company Model User Rented on Kms
1 Fiat Punto Paolo 2017-05-01 3000
2 Ferrari GTO Filippo 2017-05-22 110
3 Mercedes Class A Andrea 2017-08-01 2400
4 Volkswagen Polo Giuseppe 2017-08-02 3000
答案 1 :(得分:1)
使用Apply而不是last
data = {'Company': ['Mercedes', 'Fiat', 'Ferrari', 'Mercedes', 'Volkswagen'],
'Model': ['Class A', 'Punto', 'GTO', 'Class A', 'Polo'],
'User': ['Mario', 'Paolo', 'Filippo', 'Andrea', 'Giuseppe'],
'Rented on': ['2017-04-02', '2017-05-01', '2017-05-22', '2017-08-01', '2017-08-02'],
'Kms': [2200, 3000, 110, 2400, 3000]
}
df = pd.DataFrame(data)
df["Rented on"]=pd.to_datetime(df["Rented on"])
result = df.groupby(['Company', 'Model']).apply(lambda x: x[x["Rented on"]==x["Rented on"].max()] )
result = result.reset_index(drop=True)
display(result)