0

如果这是我的熊猫数据框:

rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['comp1', 'comp2'] * 9,
                   'B': ['user1', 'user2','user3'] * 6,
                   'C': rand.randn(18)})

    A   B   C
0   comp1   user1   1.624345
1   comp2   user2   -0.611756
2   comp1   user3   -0.528172
3   comp2   user1   -1.072969
4   comp1   user2   0.865408
5   comp2   user3   -2.301539
6   comp1   user1   1.744812
7   comp2   user2   -0.761207
8   comp1   user3   0.319039
9   comp2   user1   -0.249370
10  comp1   user2   1.462108
11  comp2   user3   -2.060141
12  comp1   user1   -0.322417
13  comp2   user2   -0.384054
14  comp1   user3   1.133769
15  comp2   user1   -1.099891
16  comp1   user2   -0.172428
17  comp2   user3   -0.877858

我想运行一个 pandas 命令来返回相同形式的结果集,但只显示 A 和 B 的每个组合的 C 的两个最大值。

我知道我可以使用以下命令按 A 和 B 升序排序,然后按 C 降序排序:

df.sort_index(by = ['A','B','C'],ascending=[True,True,False])

然后我想我需要使用 groupby 只显示 C 的两个最大值。我能得到的最接近的是使用 first() 和 last() 显示最大值和最小值

df.sort_index(by = ['A','B','C'],ascending=[True,True,False]).groupby(['A','B']).first()
df.sort_index(by = ['A','B','C'],ascending=[True,True,False]).groupby(['A','B']).last()

问题是我追求的是最大的 2(或者一般来说,最大的 x)加上我想要与原始 DataFrame 相同形式的最终结果集。

感谢您对此的帮助。

4

1 回答 1

0

如果我理解正确,您想在数据框中添加另一列,仅显示C其组中最高的值吗?如果我是正确的,您可以使用 agroupby然后遍历每个组,按C值排序并使用排序组中最高 2 个值的索引将D列的值设置为True

df['D'] = False
grouped = df.groupby(['A', 'B'])
for grouer, group in grouped:
    df.ix[group.sort_index(by='C')[-2:].index, 'D'] = True

这将产生:

        A      B         C      D
0   comp1  user1  1.624345   True
1   comp2  user2 -0.611756   True
2   comp1  user3 -0.528172  False
3   comp2  user1 -1.072969   True
4   comp1  user2  0.865408   True
5   comp2  user3 -2.301539  False
6   comp1  user1  1.744812   True
7   comp2  user2 -0.761207  False
8   comp1  user3  0.319039   True
9   comp2  user1 -0.249370   True
10  comp1  user2  1.462108   True
11  comp2  user3 -2.060141   True
12  comp1  user1 -0.322417  False

另一方面,如果您只想将最高C值过滤到新的 DataFrame 中,请执行以下操作:

indexes = []
grouped = df.groupby(['A', 'B'])
for grouer, group in grouped:
    indexes.extend(group.sort_index(by='C')[-2:].index)
df.iloc[indexes, :]

这将过滤掉每组中最高的两个,给你:

        A      B         C
0   comp1  user1  1.624345
6   comp1  user1  1.744812
4   comp1  user2  0.865408
10  comp1  user2  1.462108
8   comp1  user3  0.319039
14  comp1  user3  1.133769
3   comp2  user1 -1.072969
9   comp2  user1 -0.249370
1   comp2  user2 -0.611756
13  comp2  user2 -0.384054
11  comp2  user3 -2.060141
17  comp2  user3 -0.877858
于 2013-09-29T11:12:27.033 回答