【问题标题】:Greatest two rows in a pandas DataFrame熊猫数据框中最大的两行
【发布时间】:2013-09-29 08:55:08
【问题描述】:

如果这是我的 pandas DataFrame:

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 相同形式的最终结果集。

感谢您对此的帮助。

【问题讨论】:

    标签: python group-by pandas


    【解决方案1】:

    如果我对您的理解正确,您想在数据框中添加另一列,仅显示哪些C 值在其组中最高?如果我是正确的,您可以使用groupby 进行操作,然后遍历每个组,按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
    

    【讨论】:

    • 谢谢,维克多。是的,我在每组中都排在前两名之后。
    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2017-07-25
    • 2020-08-17
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多