当前位置: 首页 > 面试题库 >

在每个组熊猫数据框中对列进行排序并选择前n行

尹昂雄
2023-03-14
问题内容

我有一个这样的数据框:

mainid  pidx    pidy   score
  1      a        b      2
  1      a        c      5
  1      c        a      7
  1      c        b      2
  1      a        e      8
  2      x        y      1
  2      y        z      3
  2      z        y      5
  2      x        w      12
  2      x        v      1
  2      y        x      6

我要groupby on column 'pidx' 然后然后sort score in descending order in each group为每个pidx

然后select head(2)是每个组的前2名。

我正在寻找的结果是这样的:

mainid   pidx    pidy    score
  1        a      e        8
  1        a      c        5
  1        c      a        7
  1        c      b        2
  2        x      w        12
  2        x      y        1
  2        y      x        6
  2        y      z        3
  2        z      y        5

我试过的是:

df.sort(['pidx','score'],ascending = False).groupby('pidx').head(2)

这似乎可行,但我不知道如果处理庞大的数据集,这是否是正确的方法。我还能使用什么其他最佳方法来获得这种结果?


问题答案:

有两种解决方案:

1.sort_values和合计head

df1 = df.sort_values('score',ascending = False).groupby('pidx').head(2)
print (df1)

    mainid pidx pidy  score
8        2    x    w     12
4        1    a    e      8
2        1    c    a      7
10       2    y    x      6
1        1    a    c      5
7        2    z    y      5
6        2    y    z      3
3        1    c    b      2
5        2    x    y      1

2.set_index和合计nlargest

df = df.set_index(['mainid','pidy']).groupby('pidx')['score'].nlargest(2).reset_index() 
print (df)
  pidx  mainid pidy  score
0    a       1    e      8
1    a       1    c      5
2    c       1    a      7
3    c       1    b      2
4    x       2    w     12
5    x       2    y      1
6    y       2    x      6
7    y       2    z      3
8    z       2    y      5

时间

np.random.seed(123)
N = 1000000

L1 = list('abcdefghijklmnopqrstu')
L2 = list('efghijklmnopqrstuvwxyz')
df = pd.DataFrame({'mainid':np.random.randint(1000, size=N),
                   'pidx': np.random.randint(10000, size=N),
                   'pidy': np.random.choice(L2, N),
                   'score':np.random.randint(1000, size=N)})
#print (df)

def epat(df):
    grouped = df.groupby('pidx')
    new_df = pd.DataFrame([], columns = df.columns)
    for key, values in grouped:
        new_df = pd.concat([new_df, grouped.get_group(key).sort_values('score', ascending=True)[:2]], 0)
    return (new_df)

print (epat(df))

In [133]: %timeit (df.sort_values('score',ascending = False).groupby('pidx').head(2))
1 loop, best of 3: 309 ms per loop

In [134]: %timeit (df.set_index(['mainid','pidy']).groupby('pidx')['score'].nlargest(2).reset_index())
1 loop, best of 3: 7.11 s per loop

In [147]: %timeit (epat(df))
1 loop, best of 3: 22 s per loop


 类似资料:
  • 问题内容: 我想对以下数据框进行排序: 我想对它进行排序,以便根据列表对LSE列进行重新排序: 当然,其他列也需要相应地重新排序。有没有办法在熊猫里做到这一点? 问题答案: pandas0.15版中对s的改进支持使您可以轻松做到这一点: 如果这只是临时排序,则可能不希望将LSE列保留为a ,但是如果您希望这种排序能够在不同的上下文中使用几次,则是一个很好的解决方案。 在更高版本的,中,已被替换为,

  • 问题内容: 我的数据框看起来像这样,只是更大了。 首先,我尝试对每个列进行单独排序。我试过玩类似的东西:但是最终只会出错。如何分别对每一列进行排序,以得到类似以下内容的结果: 其次,我希望将列中的行连接起来 在用’‘替换np.nan之后,我可以将所有内容与上面的行结合起来,但是结果一起被粉碎(’AB’),并且需要额外的步骤来清理(变成’A:B’之类)。 问题答案: 这是一种方法: 但是,您所做的有

  • 问题内容: 我有一个熊猫数据框,如下所示: 我想按它排序,但该列只是一个。 我试图将列设置为日期对象,但是遇到了一种格式不需要的格式的问题。所需的格式为等。 因此,现在我试图找出如何使numpy将“美国”日期转换为ISO标准,以便可以使它们成为日期对象,以便可以对它们进行排序。 我该如何将这些美国日期转换为ISO标准,或者我在熊猫中缺少更直接的方法? 问题答案: 您可以用来转换为日期时间对象。它带

  • 问题内容: 我有以下数据框: 我需要以某种方式重塑数据框,以使每个id的前3列具有最高的值。结果将是这样的: 它显示了每本广告的前三名最畅销书。我已经使用R中的包完成了此操作,但是我正在寻找等效的pandas。 问题答案: 您可以用来查找每一行的 n个 最大项的索引: 产量

  • 问题内容: 我有一个具有以下内容的Series对象: 问题陈述: 我想按月显示它,并计算每个月的平均价格,然后按月以排序的方式显示它。 所需输出: 我想到了制作列表并将其传递给sort函数的方法: 但是 sort_values 不支持序列化。 我有一个大问题是,即使 最初可以工作,但是在我做完之后,它并不能保持排序后的顺序。 总而言之,我需要从初始数据帧起这两列。对datetime列进行排序,并使

  • 问题内容: 有没有一种方法可以从Pandas的DataFrame中选择随机行。 在R中,使用汽车包装,有一个有用的功能,它类似于head,但在此示例中,从x中随机选择10行。 我也看过切片文档,似乎没有什么等效的。 现在使用版本20。有一个示例方法。 问题答案: 像这样吗 注: 由于熊猫v0.20.0的, 已被弃用,赞成基于标签索引。