Groupby列,找到每组的最小值和最大值

时间:2017-09-30 10:05:50

标签: python pandas dataframe group-by pandas-groupby

我有以下数据集

        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 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分: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

或者,使用query代替x[x.Element == 'TMAX']作为x.query("Element == 'TMAX'")

答案 2 :(得分:2)

创建重复列并使用agg找到min和max,即

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'])