一列的值基于groupby之后的第二列的第一个最大值

时间:2019-07-08 03:59:56

标签: python pandas pandas-groupby

我有一个如下所示的数据框,其中我对ItrType进行了分组:

  • 如何获取Start列最大的每个组中的行在Values中的值?
  • 我只想要第一个最高;有多行,其中Values最多(20.402)。当我在Values 2和Itr 1的分组之后进行此操作时,我的预期答案应该为101(因为这是Type达到最大值的时间)。
  • 自从完成.loc以来,我无法使用groupby
  • 为此,我无法使用apply函数,因为它涉及两列。

Itr	Type	Start	Values
2	1	101	20.402
2	1	102	20.402
2	1	103	20.399
2	1	104	20.399
2	1	105	20.399
2	1	106	20.383
2	1	107	20.383
2	1	108	20.383
2	1	109	20.383
2	1	110	20.383
2	1	111	20.36
2	1	112	20.36
2	1	113	20.36
2	1	114	20.36
2	1	115	20.36
2	1	116	20.36
2	1	117	20.36
2	1	118	20.36
2	1	119	20.36
2	1	120	20.36
3	1	121	20.348
3	1	122	20.348
3	1	123	20.348
3	1	124	20.348
3	1	125	20.348
3	1	126	20.34
3	1	127	20.34
3	1	128	20.34
3	1	129	20.34
3	1	130	20.34
3	1	131	20.337
3	1	132	20.337
3	1	133	20.337
3	1	134	20.337
3	1	135	20.337
3	1	136	20.342
3	2	121	20.058
3	2	122	20.058
3	2	123	20.058
3	2	124	20.058
3	2	125	20.043
3	2	126	20.043
3	2	127	20.043
3	2	128	20.043
3	2	129	20.043
3	2	130	20.035
3	2	131	20.035
3	2	132	20.035
3	2	133	20.035
3	2	134	20.035
3	2	135	20.021

As suggested I have put a simpler df & tried to make my requirement a bit more clearer.
Itr	Type	Time	Val
2	3	101	3
2	3	102	4
2	3	103	5
2	3	104	6
2	3	105	6
2	3	106	5
2	3	107	1
1	2	101	11
1	2	102	12
1	2	103	13
1	2	104	18
1	2	105	15
1	2	106	10
4	5	101	21
4	5	102	22
4	5	103	27
4	5	104	29
4	5	105	25
4	5	106	26

我希望“时间”和“最大和最小“值” AFTER分组依据(在每个组内)在单独的列中(一列表示最大值,一列表示最小值)

1 个答案:

答案 0 :(得分:1)

我认为,如果需要原始DataFrame中的新列,则需要GroupBy.transform

g = df.groupby(['Itr','Type'])

df['max_val'] = g['Val'].transform('max')
df['min_val'] = g['Val'].transform('min')

df['time_by_first_max_val'] = (df.set_index('Time')
                                 .groupby(['Itr','Type'])['Val'].transform('idxmax').values)
print (df)
    Itr  Type  Time  Val  max_val  min_val  time_by_first_max_val
0     2     3   101    3        6        1                    104
1     2     3   102    4        6        1                    104
2     2     3   103    5        6        1                    104
3     2     3   104    6        6        1                    104
4     2     3   105    6        6        1                    104
5     2     3   106    5        6        1                    104
6     2     3   107    1        6        1                    104
7     1     2   101   11       18       10                    104
8     1     2   102   12       18       10                    104
9     1     2   103   13       18       10                    104
10    1     2   104   18       18       10                    104
11    1     2   105   15       18       10                    104
12    1     2   106   10       18       10                    104
13    4     5   101   21       29       21                    104
14    4     5   102   22       29       21                    104
15    4     5   103   27       29       21                    104
16    4     5   104   29       29       21                    104
17    4     5   105   25       29       21                    104
18    4     5   106   26       29       21                    104

GroupBy.agg,如果需要汇总值:

df2 = (df.set_index('Time')
         .groupby(['Itr','Type'], sort=False)['Val']
         .agg([('max_val', 'max'),('min_val', 'min'),('time_by_first_max_val', 'idxmax')])
         .reset_index())
print (df2)

   Itr  Type  max_val  min_val  time_by_first_max_val
0    2     3        6        1                    104
1    1     2       18       10                    104
2    4     5       29       21                    104