保持由项目定义的重复行

时间:2018-07-04 12:33:09

标签: python pandas duplicates

问题::仅保留一项定义的重复项(日期)。

假设您有这个DataFrame,且日期重复:

       Name    Item    Date        value1  value2
...
1235   Marc    A       21-Dec-17   7       1000
1236   Marc    H       05-Jan-18   9       2000
1237   Marc    Q       27-Jul-18   4       500
1238   John    H       14-Dec-17   4       500
1239   John    Q       07-Feb-18   6       500
1240   John    A       07-Feb-18   8       1000
1241   John    H       07-Feb-18   2       1000
1242   John    A       05-Dec-21   7       1000
1243   John    Q       27-Aug-25   8       500
1244   John    H       27-Aug-25   4       700
...

col Item的唯一值为t = ['A', 'H', 'Q']。按t的重要性排名为:A,Q和最后H。

例如行1239-1241,我只想保留1240行,对于行1243-1244,我只想保留1243。

我很难通过dataframe进行逐行迭代。而且由于dataframe很大,我正在寻找一种更快的解决方案。有一种优雅的方法吗?

1 个答案:

答案 0 :(得分:4)

使用:

df['Item'] = pd.Categorical(df['Item'], categories= ['H','Q','A'], ordered=True)
df['Date'] = pd.to_datetime(df['Date'])

df = df.sort_values(['Date','Item'], ascending=[True, False]).drop_duplicates('Date')
print (df)
      Name Item       Date  value1  value2
1238  John    H 2017-12-14       4     500
1235  Marc    A 2017-12-21       7    1000
1236  Marc    H 2018-01-05       9    2000
1240  John    A 2018-02-07       8    1000
1237  Marc    Q 2018-07-27       4     500
1242  John    A 2021-12-05       7    1000
1243  John    Q 2025-08-27       8     500

说明

  1. 首先将Item列转换为ordered categoricals
  2. to_datetime转换日期
  3. 在两列和最后sort_values前按drop_duplicates排序

如果要通过Name列检查重复项:

df = df.sort_values(['Name','Item'], ascending=False).drop_duplicates('Name')
print (df)
      Name Item       Date  value1  value2
1236  Marc    H 2018-01-05       9    2000
1238  John    H 2017-12-14       4     500

通过NameDate s:

df = df.sort_values(['Name','Date','Item'], ascending=False).drop_duplicates(['Name', 'Date'])
print (df)
      Name Item       Date  value1  value2
1237  Marc    Q 2018-07-27       4     500
1236  Marc    H 2018-01-05       9    2000
1235  Marc    A 2017-12-21       7    1000
1244  John    H 2025-08-27       4     700
1242  John    A 2021-12-05       7    1000
1241  John    H 2018-02-07       2    1000
1238  John    H 2017-12-14       4     500