1

可以说我有这样的数据框:

df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4','col5']

东风:

   col1 col2 col3     col4 col5
0   1.1    A  1.1    x/y/z    1
1   1.1    A  1.7      x/y    3
2   1.1    A  2.5  x/y/z/n    3
3   2.6    B  2.6      x/u    2
4   2.5    B  3.3        x    4
5   3.4    B  3.8    x/u/v    2
6   2.6    B    4    x/y/z    5
7   2.6    A  4.2        x    3
8   3.4    B  4.3  x/u/v/b    6
9   3.4    C  4.5        -    3
10  2.6    B  4.6      x/y    5
11  1.1    D  4.7    x/y/z    1
12  1.1    D  4.7        x    1
13  3.3    D  4.8  x/u/v/w    1

我想得到以下输出

t = df.groupby('col5').col1.size()
t.sort()
t[-3:] 

输出:

col5
5       2
1       4
3       4

然后我想得到与 'col5' 值对应的 'col1' 值。我可以像下面这样一一获得。

df[df['col5'] == '5']['col1'].unique()

但我想一次得到所有三个(或n个数字)。可能吗?这个怎么做?

4

2 回答 2

1

用于isin过滤您想要的值:

In [34]: df[df.col5.isin(t[-3:].index)]['col1'].unique()
Out[34]: array([1.1, 2.6, 3.4, 3.3], dtype=object)
于 2013-07-16T10:01:45.023 回答
1

我不是 100% 确定我理解你想要什么(你需要哪 3 个数字?),但你可能想查看 groupby 对象的 groups 参数:

In [398]: df.groupby('col5').groups

这将返回组键和组的索引

Out[398]: 
{'1': [0L, 11L, 12L, 13L],
 '2': [3L, 5L],
 '3': [1L, 2L, 7L, 9L],
 '4': [4L],
 '5': [6L, 10L],
 '6': [8L]}

根据该结果,您可以构建所需的任何输出:

In [399]: {col5:df.lookup(ix_list,["col1"]*len(ix_list)) for col5, ix_list in df.groupby('col5').groups.iteritems()}
Out[399]: 
{'1': array([ 1.1,  1.1,  1.1,  3.3]),
 '2': array([ 2.6,  3.4]),
 '3': array([ 1.1,  1.1,  2.6,  3.4]),
 '4': array([ 2.5]),
 '5': array([ 2.6,  2.6]),
 '6': array([ 3.4])}
于 2013-07-16T10:16:20.510 回答