我有一个数据框,我想找到基于颜色和价格的重复项。然后使用最新(基于日期)行的代码更改代码,该代码在详细信息列中没有Nan值。我不希望删除任何行。数据框如下:
id Color Price Code Date Detail
1 White 1.50 111 3-22-2017 12:00 aa
2 Green 2.20 222 3-23-2017 09:55 bb
3 Black 3.00 333 3-24-2017 11:45 cc
4 White 1.50 111 3-23-2017 10:20 Nan
5 White 1.50 444 3-23-2017 08:15 ee
6 Green 2.20 555 3-25-2017 07:05 ff
结果应该是这样的:
id Color Price Code Date Detail
1 White 1.50 *444* 3-22-2017 12:00 aa
2 Green 2.20 *555* 3-23-2017 09:55 bb
3 Black 3.00 333 3-24-2017 11:45 cc
4 White 1.50 *444* 3-23-2017 10:20 Nan
5 White 1.50 444 3-23-2017 08:15 ee
6 Green 2.20 555 3-25-2017 07:05 ff
此代码完成了一半的工作,它没有考虑详细信息列。那么,我应该改变什么呢?也许用notnull()?
df['Date'] = pd.to_datetime(df['Date'])
df['Code'] = df.sort_values('Date').groupby(['Color', 'Price'])['Code'].transform('last')
答案 0 :(得分:2)
您需要使用GroupBy.apply
自定义功能,因为GroupBy.transform
无法一次使用2列。
df['Date'] = pd.to_datetime(df['Date'])
def f(x):
a = x.loc[x['Detail'].notnull(), 'Code']
#added if-else because no match return error in iat (iloc) functions
x['Code'] = np.nan if a.empty else a.iat[-1]
return x
df = df.sort_values('Date').groupby(['Color', 'Price'], sort=False).apply(f).sort_index()
print (df)
id Color Price Code Date Detail
0 1 White 1.5 444 2017-03-22 12:00:00 aa
1 2 Green 2.2 555 2017-03-23 09:55:00 bb
2 3 Black 3.0 333 2017-03-24 11:45:00 cc
3 4 White 1.5 444 2017-03-23 10:20:00 NaN
4 5 White 1.5 444 2017-03-23 08:15:00 ee
5 6 Green 2.2 555 2017-03-25 07:05:00 ff