我有一个按“键”分组的数据框。我需要在每个组内比较行,以确定是否要保留该组的每一行还是只保留一行。
在保留组中的所有行的条件下:如果有一行具有颜色为“红色”,面积为“12”,形状为“圆形”,并且另一行(在同一组内)具有颜色为“绿色”,面积为“13”,形状为“正方形”,则我希望保留该组中的所有行。否则,如果不存在这种情况,则我希望保留该组中具有最大“num”值的行。
在保留组中的所有行的条件下:如果有一行具有颜色为“红色”,面积为“12”,形状为“圆形”,并且另一行(在同一组内)具有颜色为“绿色”,面积为“13”,形状为“正方形”,则我希望保留该组中的所有行。否则,如果不存在这种情况,则我希望保留该组中具有最大“num”值的行。
df = pd.DataFrame({'KEY': ['100000009', '100000009', '100000009', '100000009', '100000009','100000034','100000034', '100000034'],
'Date1': [20120506, 20120506, 20120507,20120608,20120620,20120206,20120306,20120405],
'shape': ['circle', 'square', 'circle','circle','circle','circle','circle','circle'],
'num': [3,4,5,6,7,8,9,10],
'area': [12, 13, 12,12,12,12,12,12],
'color': ['red', 'green', 'red','red','red','red','red','red']})
Date1 KEY area color num shape
0 2012-05-06 100000009 12 red 3 circle
1 2012-05-06 100000009 13 green 4 square
2 2012-05-07 100000009 12 red 5 circle
3 2012-06-08 100000009 12 red 6 circle
4 2012-06-20 100000009 12 red 7 circle
5 2012-02-06 100000034 12 red 8 circle
6 2012-03-06 100000034 12 red 9 circle
7 2012-04-05 100000034 12 red 10 circle
预期结果:
Date1 KEY area color num shape
0 2012-05-06 100000009 12 red 3 circle
1 2012-05-06 100000009 13 green 4 square
2 2012-05-07 100000009 12 red 5 circle
3 2012-06-08 100000009 12 red 6 circle
4 2012-06-20 100000009 12 red 7 circle
7 2012-04-05 100000034 12 red 10 circle
我是Python的新手,groupby这个函数让我有些困惑。
maxnum = df.groupby('KEY')['num'].transform(max)
df = df.loc[df.num == maxnum]
cond1 = (df[df['area'] == 12]) & (df[df['color'] == 'red']) & (df[df['shape'] == 'circle'])
cond2 = (df[df['area'] == 13]) & (df[df['color'] == 'green']) & (df[df['shape'] == 'square'])