按列分组并找到每个组的最小值和最大值。

3
我有以下数据集,
        Day    Element  Data_Value
6786    01-01   TMAX    112
9333    01-01   TMAX    101
9330    01-01   TMIN    60
11049   01-01   TMIN    0
6834    01-01   TMIN    25
11862   01-01   TMAX    113
1781    01-01   TMAX    115
11042   01-01   TMAX    105
1110    01-01   TMAX    111
651     01-01   TMIN    44
11350   01-01   TMIN    83
1798    01-02   TMAX    70
4975    01-02   TMAX    79
12774   01-02   TMIN    0
3977    01-02   TMIN    60
2485    01-02   TMAX    73
4888    01-02   TMIN    31
11836   01-02   TMIN    26
11368   01-02   TMAX    71
2483    01-02   TMIN    26

我希望能够按照天进行分组,然后找到TMIN的最小值和TMAX的最大值,将它们放入数据框中,从而获得如下输出结果...

Day    DayMin    DayMax
01-01  0         115
01-02  0         79

我知道我需要做些什么,

df.groupby(by='Day')

但是我卡在了下一步 - 是否应该创建列来存储TMAX和TMIN的值?

3个回答

11

您可以使用assign + abs,然后是groupby + agg

df = (df.assign(Data_Value=df['Data_Value'].abs())
       .groupby(['Day'])['Data_Value'].agg([('Min' , 'min'), ('Max', 'max')])
       .add_prefix('Day'))

df 
       DayMin  DayMax
Day                  
01-01       0     115
01-02       0      79

真是个笨蛋,我完全忘记了我们可以将列表传递给agg函数。至少我得到了列名作为一种防御措施,没关系。 - Bharath M Shetty
你做了一个假设,即TMIN不会大于TMAX的值? - Zero
@Zero我并没有读出任何数据的含义。实际上,我可能误读了问题。 - cs95
@TheCat 哎呀,你确实说过你想要绝对值...所以才使用了 abs。如果你不想要它,只需移除赋值调用即可。其他部分保持不变。 - cs95
哦,是我不好,我有点想说的是总体的最小/最大值,而不是任何平均值。 - The Cat
显示剩余3条评论

3

使用

In [5265]: def maxmin(x):
      ...:     mx = x[x.Element == 'TMAX'].Data_Value.max()
      ...:     mn = x[x.Element == 'TMIN'].Data_Value.min()
      ...:     return pd.Series({'DayMin': mn, 'DayMax': mx})
      ...:

In [5266]: df.groupby('Day').apply(maxmin)
Out[5266]:
       DayMax  DayMin
Day
01-01     115       0
01-02      79       0

另外,

In [5268]: df.groupby('Day').apply(maxmin).reset_index()
Out[5268]:
     Day  DayMax  DayMin
0  01-01     115       0
1  01-02      79       0

或者,使用x.query("Element == 'TMAX'")代替x[x.Element == 'TMAX']来进行查询。


1
创建重复列并使用agg查找最小值和最大值,例如:
ndf = df.assign(DayMin = df['Data_Value'].abs(),DayMax=df['Data_Value'].abs()).groupby('Day')\
     .agg({'DayMin':'min','DayMax':'max'})
     DayMax  DayMin
Day                  
01-01     115       0
01-02      79       0

如果您想要TMIN和TMAX,则使用groupby(['Day','Element'])


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接