在pandas中查找重复项,并使用非Nan值按日期修改它们

时间:2017-09-21 07:27:12

标签: python pandas dataframe

我有一个数据框,我想找到基于颜色和价格的重复项。然后使用最新(基于日期)行的代码更改代码,该代码在详细信息列中没有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')

1 个答案:

答案 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