用日期列和混合列数据类型过滤的熊猫

时间:2019-09-22 15:41:09

标签: python pandas

我有一个类似于下面的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()

2 个答案:

答案 0 :(得分:1)

您可以将transformboolean 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)