使用Pandas.groupby选择具有一些条件的组中的行?

时间:2016-01-19 03:15:07

标签: python pandas

我有一个像这样的数据框

data = pd.DataFrame({'name': [1, 2, 2, 2, 3 , 3, 4], 
                     'type': ['A', 'B', 'B', 'C', 'B', 'C', 'A'], 
                     'hist' : [1,2,1,3,0,3,4]})

data
Out[1]: 
   hist  name type
0     1     1    A
1     2     2    B
2     1     2    B
3     3     2    C
4     0     3    B
5     3     3    C
6     4     4    A

我希望这些数据变得像

data 
Out[2]: 
   hist  name type
0     1     1    A
1     2     2    B
2     3     2    C
3     0     3    B
4     3     3    C
5     4     4    A

这意味着我首先应用groupby(['name', 'type']),然后对于每个组,我想选择列hist中具有最高值的列。例如,我从

得到了想法
gps = data.groupby(['name', 'type'])
keys  = gps.groups.viewkeys()
Out[3]: dict_keys([(3L, 'C'), (3L, 'B'), (2L, 'B'), (2L, 'C'), (1L, 'A'), (4L, 'A')])
gps.get_group(list(keys)[2])
Out[4]: 
   hist  name type
1     2     2    B
2     1     2    B

我的方法是

def mfunc(df):
    if len(df) > 1:
        idx = df['hist'].idxmax()
        l_idx = df.index.tolist()
        rm_list = list(set(l_idx) - set([idx]))
        df.drop(pd.Int64Index(rm_list), inplace=True)
    else: 
        pass
result = data.groupby(['name', 'type']).apply(mfunc) 

但是result是一个空的DataFrame。

你可以帮助我在这种情况下使用应用功能吗?感谢

2 个答案:

答案 0 :(得分:0)

这可能是一种更有效的方法:

var arrInArr = new Array();

或者,你可以这样做:

data.groupby(['name', 'type'])['hist'].max()

答案 1 :(得分:0)

您可以将pivot_table用于此目的:

df1 = pd.pivot_table(data, index=['name', 'type'], aggfunc=max).reset_index()
In [20]: df1
Out[20]:
   name type  hist
0     1    A     1
1     2    B     2
2     2    C     3
3     3    B     0
4     3    C     3
5     4    A     4

如果您需要列的特定顺序,可以重新排序结果:

In [33]: df2 = df1[['hist', 'name', 'type']]

In [34]: df2
Out[34]:
   hist  name type
0     1     1    A
1     2     2    B
2     3     2    C
3     0     3    B
4     3     3    C
5     4     4    A