2017-07-28 62 views
0

变化值在I组有哪些:熊猫:最低

df = pd.DataFrame({'SERIES1':['A','A','A','A','A','A','B','B','B','B','B','B','B','B','C','C','C','C','C'], 
        'SERIES2':[1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1], 
        'SERIES3':[10,12,20,10,12,4,8,8,1,10,12,12,13,13,9,8,7,7,7]}) 

    SERIES1 SERIES2 SERIES3 
0  A  1  10 
1  A  1  12 
2  A  1  20 
3  A  1  10 
4  A  2  12 
5  A  2  4 
6  B  1  8 
7  B  1  8 
8  B  1  1 
9  B  1  10 
10  B  1  12 
11  B  1  12 
12  B  1  13 
13  B  1  13 
14  C  1  9 
15  C  1  8 
16  C  1  7 
17  C  1  7 
18  C  1  7 

我需要的是按SERIES1和SERIES2和值在SERIES3转换到最低限度组。即:

df2 = pd.DataFrame({'SERIES1':['A','A','A','A','A','A','B','B','B','B','B','B','B','B','C','C','C','C','C'], 
        'SERIES2':[1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1], 
        'SERIES3':[10,10,10,10,4,4,1,1,1,1,1,1,1,1,7,7,7,7,7]}) 

    SERIES1 SERIES2 SERIES3 
0  A  1  10 
1  A  1  10 
2  A  1  10 
3  A  1  10 
4  A  2  4 
5  A  2  4 
6  B  1  1 
7  B  1  1 
8  B  1  1 
9  B  1  1 
10  B  1  1 
11  B  1  1 
12  B  1  1 
13  B  1  1 
14  C  1  7 
15  C  1  7 
16  C  1  7 
17  C  1  7 
18  C  1  7 

我有一种感觉,这可以用.groupby()来实现,但我不知道如何取代它在现有的数据帧,或将其添加为新的系列。

我能够得到:

df.groupby(['SERIES1', 'SERIES2']).min() 

       SERIES3 
SERIES1 SERIES2   
A  1    10 
     2    4 
B  1    1 
C  1    7 

这是每组正确的最小值,但我不能想出一个简单的方法来弹出该回到原来的数据帧。

回答

1

您可以使用groupby.transform,这还给长度相同系列的可分配回数据帧:

df['SERIES3'] = df.groupby(['SERIES1', 'SERIES2']).SERIES3.transform('min') 
df 

enter image description here