熊猫:查找重复项并根据日期修改它们

时间:2017-08-17 11:55:34

标签: python pandas dataframe duplicates

我有一个数据框,我想找到基于颜色和价格的重复项。然后使用最新代码(基于日期)行更改代码。我不希望删除任何行。 数据框如下:

id   Color   Price   Code       Date 
1   White    1.50     111   3-22-2017 12:00
2   Green    2.20     222   3-23-2017 09:55
3   Black    3.00     333   3-24-2017 11:45
4   White    1.50     111   3-23-2017 10:20
5   White    1.50     444   3-23-2017 08:15
6   Green    2.20     555   3-25-2017 07:05

结果应该是这样的:

   id   Color   Price   Code       Date 
    1   White    1.50     111   3-22-2017 12:00
    2   Green    2.20     **555**   3-23-2017 09:55
    3   Black    3.00     333   3-24-2017 11:45
    4   White    1.50     111   3-23-2017 10:20
    5   White    1.50     **111**   3-23-2017 08:15
    6   Green    2.20     555   3-25-2017 07:05

我知道答案接近答案here,但日期的形式让我感到困惑。

3 个答案:

答案 0 :(得分:3)

尝试使用df.groupby后跟dfGroupBy.transform来选择最后一个值:

In [406]: df.Code = df.sort_values('Date')\
                      .groupby(['Color', 'Price']).Code.transform('last') # faster than lambda 

In [407]: df
Out[407]: 
   id  Color  Price  Code             Date
0   1  White    1.5   111  3-22-2017 12:00
4   5  White    1.5   111  3-23-2017 08:15
1   2  Green    2.2   555  3-23-2017 09:55
3   4  White    1.5   111  3-23-2017 10:20
2   3  Black    3.0   333  3-24-2017 11:45
5   6  Green    2.2   555  3-25-2017 07:05

首先致电Date,确保您的数据框按df.sort_values排序。

另外,正如jezrael指出的那样,我认为您的预期输出是不正确的。要获得正确的输出,您必须确保Date属于pd.datetime类型。如果不是,请转换它。

答案 1 :(得分:2)

为了完整起见,这是一个不需要按日期排序的解决方案。 您可以通过

获取每个颜色 - 价格对的最新行
key = [df.Color, df.Price]; 
most_recent = df.groupby(key).Date.transform(max)

然后做

code = df.Code.where(df.Date == most_recent).groupby(key).transform(max)

答案 2 :(得分:2)

我认为您需要sort_values GroupBy.transform和功能last

#if not datetime, convert it
df['Date'] = pd.to_datetime(df['Date'])

df['Code'] = df.sort_values('Date').groupby(['Color', 'Price'])['Code'].transform('last')
print (df)
   id  Color  Price  Code                Date
0   1  White    1.5   111 2017-03-22 12:00:00
1   2  Green    2.2   555 2017-03-23 09:55:00
2   3  Black    3.0   333 2017-03-24 11:45:00
3   4  White    1.5   111 2017-03-23 10:20:00
4   5  White    1.5   111 2017-03-23 08:15:00
5   6  Green    2.2   555 2017-03-25 07:05:00