如何仅保留Pandas中每个订单的最新修订订单

时间:2018-01-11 21:32:08

标签: python python-2.7 pandas dataframe

假设我有一个跟踪订单号的数据框,以及两个不同列中该订单的修订号,如下所示:

OrderNum  RevNum  TotalPrice
 0AXL3     0       $5.00
 0AXL3     1       $4.00
 0AXL3     2       $7.00
 0AXL3     3       $8.00
 0BDF1     0       $3.00
 0BDF1     1       $2.50
 0BDF1     2       $8.50

我们想要的结果是一个新的数据框,只有每个订单的最新版本,所以:

OrderNum  RevNum  TotalPrice
 0AXL3     3       $8.00
 0BDF1     2       $8.50

在熊猫中有快速的方法吗?

2 个答案:

答案 0 :(得分:1)

IIUC:

In [100]: df.groupby('OrderNum', as_index=False).last()
Out[100]:
  OrderNum  RevNum TotalPrice
0    0AXL3       3      $8.00
1    0BDF1       2      $8.50

<强>更新

  

如果数据框中还有其他列,那么这会保留这些列   还有吗?

In [116]: df['new'] = np.arange(len(df))

In [117]: df
Out[117]:
  OrderNum  RevNum TotalPrice  new
0    0AXL3       0      $5.00    0
1    0AXL3       1      $4.00    1
2    0AXL3       2      $7.00    2
3    0AXL3       3      $8.00    3
4    0BDF1       0      $3.00    4
5    0BDF1       1      $2.50    5
6    0BDF1       2      $8.50    6

In [118]: df.groupby('OrderNum', as_index=False).last()
Out[118]:
  OrderNum  RevNum TotalPrice  new
0    0AXL3       3      $8.00    3
1    0BDF1       2      $8.50    6

答案 1 :(得分:1)

一种方法是使用drop_duplicates,注意数据框应该在RevNum上从最小到最大排序,或者你可以添加sort_values:

df1.drop_duplicates(subset='OrderNum', keep='last')

输出:

  OrderNum  RevNum TotalPrice
3    0AXL3       3      $8.00
6    0BDF1       2      $8.50

OR

df1[~df1.duplicated(subset='OrderNum', keep='last')]

输出:

  OrderNum  RevNum TotalPrice
3    0AXL3       3      $8.00
6    0BDF1       2      $8.50