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

python pandas,DF.groupby()。agg(),agg()中的列引用

谭毅然
2023-03-14
问题内容

关于一个具体问题,说我有一个DataFrame DF

     word  tag count
0    a     S    30
1    the   S    20
2    a     T    60
3    an    T    5
4    the   T    10

我想 为每个“单词” 找到 具有最多“计数”的“标签 。因此,回报将类似于

     word  tag count
1    the   S    20
2    a     T    60
3    an    T    5

我不在乎计数列或订单/索引是原始的还是混乱的。返回字典{ ‘the’:’S’ ,…}很好。

我希望我能做

DF.groupby(['word']).agg(lambda x: x['tag'][ x['count'].argmax() ] )

但这不起作用。我无法访问列信息。

更抽象地讲, agg( function 中的 函数 将其视为 __什么?

顺便说一句,.agg()与.aggregate()相同吗?

非常感谢。


问题答案:

agg与相同aggregate。可调用的是一次传递一次的列(Series对象)DataFrame

您可以idxmax用来收集具有最大计数的行的索引标签:

idx = df.groupby('word')['count'].idxmax()
print(idx)

产量

word
a       2
an      3
the     1
Name: count

然后用于locwordtag列中选择那些行:

print(df.loc[idx, ['word', 'tag']])

产量

  word tag
2    a   T
3   an   T
1  the   S

请注意,idxmax返回索引 标签
df.loc可用于按标签选择行。但是,如果索引不是唯一的-即,如果存在带有重复索引标签的行-df.loc则将选择带有标签的
所有行idx。所以,要小心,df.index.is_uniqueTrue如果你使用idxmaxdf.loc

或者,您可以使用applyapply的callable传递了一个sub-DataFrame,它使您可以访问所有列:

import pandas as pd
df = pd.DataFrame({'word':'a the a an the'.split(),
                   'tag': list('SSTTT'),
                   'count': [30, 20, 60, 5, 10]})

print(df.groupby('word').apply(lambda subf: subf['tag'][subf['count'].idxmax()]))

产量

word
a       T
an      T
the     S

使用idxmaxloc通常比快apply,尤其是对于大型DataFrame。使用IPython的%timeit:

N = 10000
df = pd.DataFrame({'word':'a the a an the'.split()*N,
                   'tag': list('SSTTT')*N,
                   'count': [30, 20, 60, 5, 10]*N})
def using_apply(df):
    return (df.groupby('word').apply(lambda subf: subf['tag'][subf['count'].idxmax()]))

def using_idxmax_loc(df):
    idx = df.groupby('word')['count'].idxmax()
    return df.loc[idx, ['word', 'tag']]

In [22]: %timeit using_apply(df)
100 loops, best of 3: 7.68 ms per loop

In [23]: %timeit using_idxmax_loc(df)
100 loops, best of 3: 5.43 ms per loop

如果你想有一个字典映射字标签,那么你可以使用set_indexto_dict这样的:

In [36]: df2 = df.loc[idx, ['word', 'tag']].set_index('word')

In [37]: df2
Out[37]: 
     tag
word    
a      T
an     T
the    S

In [38]: df2.to_dict()['tag']
Out[38]: {'a': 'T', 'an': 'T', 'the': 'S'}


 类似资料:
  • AGG

    AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行。 主要的功能有: 1、支持ALPHA、GAMMA等变色处理,以及用户自定义的变色处理; 2、支持任意2D图形变换; 3、支持SVG和PostScript描述,

  • Agg 是 PostgreSQL 的并行聚合工具。在很长的时间里 PostgreSQL 只是使用单 CPU 核心来执行昂贵的聚合。Agg 的目的是要改变这种情况,把分析操作扩展到大量的 CPU 核心,使用系统的全部计算能力来执行。 特性 并行执行常规聚合 (sum, count, min, max, etc.) 支持 FILTER-clauses 支持约束限制 (每个分区由一个 CPU 核心处理)

  • Agg-Sharp 是 Agg 的 .NET 移植。AGG 是一个开源的二维图形引擎。它提供一套结合了亚像素(subpixel accuracy)技术与反走样(anti-aliasing)技术的图形算法,实现高效率、高质量的二维图形处理功能。AGG 的另一个特点在于它极大的灵活性。其作者将它描述为“创建其它工具的工具”。AGG 提供一系列松耦合的算法,而且其所有类均采用模板(template)进行

  • 本章开始,就提到 K4/5 和 K3 的区别,在 K4/5 中,即便介绍完了全部 visualize 的配置项,也不代表用户能立刻上手配置出来和 K3 一样的面板。所以本节,会以几个具体的日志分析需求为例,演示在 K4 中,利用 Elasticsearch 1.0 以后提供的 Aggregation 特性,能够做到哪些有用的可视化效果。

  • 我医生看起来像 我想拥有超过 100个文档在50到100个之间少于100个文档我尝试使用不同的聚合,但我不知道如何在另一个聚合的计数上进行范围聚合 谢谢你的帮助,

  • 我想计算一天内每个产品的每个IP访问计数。 一个索引中有三个参数(nginx访问日志): 时间戳 客户IP product\u id 我知道date\u直方图可以参考https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-datehistogram-aggregation.