Python Pandas:来自数据帧的复杂子集



我有一个包含组、两个日期和一个值的数据帧。

我想要数据帧的子集,它为每个 GRP 保留具有唯一B_DATE值的所有行。 如果每个组中有重复的B_DATE值,我想保留具有最大A_DATE值的行。

因此,如果我的初始数据帧是:

GRP  A_DATE        B_DATE   VALUE
A   12/31/2012  2/19/2014   546.2
A   12/31/2013  2/19/2014   543.7
A   3/31/2013   4/30/2014   473.3
A   3/31/2014   4/30/2014   472.5
A   6/30/2013   7/30/2014   528.7
A   6/30/2014   7/30/2014   531.5
A   9/30/2013   10/30/2014  529
A   9/30/2014   10/30/2014  546.7
A   12/31/2014  2/18/2015   573.5
A   3/31/2015   4/30/2015   458.7
A   6/30/2015   7/30/2015   519.5
B   3/31/2014   7/7/2015    1329
B   12/31/2014  7/7/2015    1683
B   3/31/2015   7/7/2015    1361
B   6/30/2014   8/13/2015   1452
B   6/30/2015   8/13/2015   1429
B   9/30/2014   10/29/2015  1488
B   9/30/2015   10/29/2015  1595
B   12/31/2015  2/16/2016   1763
B   3/31/2016   4/28/2016   1548

我希望结果看起来像这样:

GRP  A_DATE        B_DATE   VALUE
A   12/31/2013  2/19/2014   543.7
A   3/31/2014   4/30/2014   472.5
A   6/30/2014   7/30/2014   531.5
A   9/30/2014   10/30/2014  546.7
A   12/31/2014  2/18/2015   573.5
A   3/31/2015   4/30/2015   458.7
A   6/30/2015   7/30/2015   519.5
B   3/31/2015   7/7/2015    1361
B   6/30/2015   8/13/2015   1429
B   9/30/2015   10/29/2015  1595
B   12/31/2015  2/16/2016   1763
B   3/31/2016   4/28/2016   1548

我知道如何通过繁琐的循环和使用 argmax(( 来做到这一点。 但是,想知道是否有一种"干净",高效,Pythonic的方法。

提前谢谢。

让我们使用 sort_valuesdrop_duplicates

df.sort_values(['GRP','A_DATE'], ascending=[True,False])
  .drop_duplicates(subset=['GRP','B_DATE'])

输出:

   GRP      A_DATE      B_DATE   VALUE
7    A   9/30/2014  10/30/2014   546.7
10   A   6/30/2015   7/30/2015   519.5
5    A   6/30/2014   7/30/2014   531.5
9    A   3/31/2015   4/30/2015   458.7
3    A   3/31/2014   4/30/2014   472.5
8    A  12/31/2014   2/18/2015   573.5
1    A  12/31/2013   2/19/2014   543.7
17   B   9/30/2015  10/29/2015  1595.0
15   B   6/30/2015   8/13/2015  1429.0
19   B   3/31/2016   4/28/2016  1548.0
13   B   3/31/2015    7/7/2015  1361.0
18   B  12/31/2015   2/16/2016  1763.0

并且,添加sort_index以取回原始订单:

df.sort_values(['GRP','A_DATE'], ascending=[True,False])
  .drop_duplicates(subset=['GRP','B_DATE']).sort_index()
   GRP      A_DATE      B_DATE   VALUE
1    A  12/31/2013   2/19/2014   543.7
3    A   3/31/2014   4/30/2014   472.5
5    A   6/30/2014   7/30/2014   531.5
7    A   9/30/2014  10/30/2014   546.7
8    A  12/31/2014   2/18/2015   573.5
9    A   3/31/2015   4/30/2015   458.7
10   A   6/30/2015   7/30/2015   519.5
13   B   3/31/2015    7/7/2015  1361.0
15   B   6/30/2015   8/13/2015  1429.0
17   B   9/30/2015  10/29/2015  1595.0
18   B  12/31/2015   2/16/2016  1763.0
19   B   3/31/2016   4/28/2016  1548.0

我认为您想按B_DATE和"GRP"聚合最后一个值进行分组,即

df['A_DATE'] = pd.to_datetime(df['A_DATE'])
df['B_DATE'] = pd.to_datetime(df['B_DATE'])
ndf = df.groupby(['GRP',df['B_DATE']]).agg('last').reset_index()
     玻璃钢B_DATE A_DATE价值0 安 2014-02-19 2013-12-31 543.71 安培 2014-04-30 2014-03-31 472.52 安 2014-07-30 2014-06-30 531.53 安 2014-10-30 2014-09-30 546.74 安 2015-02-18 2014-12-31 573.55 安 2015-04-30 2015-03-31 458.76 安培 2015-07-30 2015-06-30 519.57 字节 2015-07-07 2015-03-31 1361.08 字节 2015-08-13 2015-06-30 1429.09 字节 2015-10-29 2015-09-30 1595.010 字节 2016-02-16 2015-12-31 1763.011 字节 2016-04-28 2016-03-31 1548.0

最新更新