我有一个数据框,我想找到基于颜色和价格的重复项。然后使用最新代码(基于日期)行更改代码。我不希望删除任何行。 数据框如下:
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,但日期的形式让我感到困惑。
答案 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