【问题标题】:Groupby data - show min and max dates and corresponding valuesGroupby 数据 - 显示最小和最大日期以及相应的值
【发布时间】:2021-02-20 23:05:23
【问题描述】:

我有以下框架:

frame=pd.DataFrame(data=(['London','2020-08-31',3,4],['London','2020-09-30',1,5],
                         ['London','2020-10-31',2,6],['London','2020-11-30',7,3],
                         ['Paris','2020-08-31',9,3],['Paris','2020-09-30',1,8],
                         ['Paris','2020-10-31',4,5],['Paris','2020-11-30',2,9],
                         ['Paris','2020-12-31',3,8]),columns=["Location","Date","X","Y"])

看起来像这样:

    Location    Date    X   Y
0   London  2020-08-31  3   4
1   London  2020-09-30  1   5
2   London  2020-10-31  2   6
3   London  2020-11-30  7   3
4   Paris   2020-08-31  9   3
5   Paris   2020-09-30  1   8
6   Paris   2020-10-31  4   5
7   Paris   2020-11-30  2   9
8   Paris   2020-12-31  3   8

我想按位置分组并显示最小和最大日期及其对应的值。预期的输出是这样的:

                                                   X                               Y    
Location    Min_Date    Max_Date    Min_Date_Value  Max_Date_Value  Min_Date_Value  Max_Date_Value
London      8/31/2020   11/30/2020        3               7                4              3
Paris       8/31/2020   12/31/2020        9               3                3              8

我可以通过frame.groupby(by="Location")["Date"].agg(["min","max"]) 生成最小和最大日期,但之后我也很难将每个日期对应值的列可视化。

【问题讨论】:

  • 试试frame.groupby(by="Location").agg(["min","max"])
  • 这不会给出你期望的值,它会为每一列选择最大值和最小值,并且不会对应于日期的最大值和最小值

标签: python pandas pandas-groupby


【解决方案1】:

如果您想要聚合日期然后拉取相应的行,您可以尝试以下操作:

u = frame.groupby(by="Location")["Date"].agg(["min","max"])
out = (u.stack().reset_index(name='Date').merge(frame)
       .set_index(['Location','level_1']).unstack())
out.columns = out.columns.map('_'.join)

print(out)

            Date_max    Date_min  X_max  X_min  Y_max  Y_min
Location                                                    
London    2020-11-30  2020-08-31      7      3      3      4
Paris     2020-12-31  2020-08-31      3      9      8      3

【讨论】:

  • @MartinYordanovGeorgiev 如果您的日期列是日期时间,您也可以尝试 frame.loc[frame.groupby(by="Location")["Date"].agg(["idxmin","idxmax"]).stack()] 并从那里获取 :)
猜你喜欢
  • 2012-03-13
  • 2021-12-15
  • 2014-09-21
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多