繁体   English   中英

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

[英]Use Pandas.groupby to select a row in a group with some criteria?

我有一个这样的数据框

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。

在这种情况下,您能帮我使用Apply功能吗? 谢谢

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

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

或者,您可以这样做:

data.sort('hist', ascending=False).drop_duplicates(subset=['name', 'type'])

您可以出于此目的使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM