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

熊猫groupby方法实际上是如何工作的?

宦博超
2023-03-14
问题内容

因此,我试图理解pandas.dataFrame.groupby()函数,并在文档中遇到了以下示例:

    In [1]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
   ...:                           'foo', 'bar', 'foo', 'foo'],
   ...:                    'B' : ['one', 'one', 'two', 'three',
   ...:                           'two', 'two', 'one', 'three'],
   ...:                    'C' : np.random.randn(8),
   ...:                    'D' : np.random.randn(8)})
   ...:

In [2]: df
Out[2]: 
     A      B         C         D
0  foo    one  0.469112 -0.861849
1  bar    one -0.282863 -2.104569
2  foo    two -1.509059 -0.494929
3  bar  three -1.135632  1.071804
4  foo    two  1.212112  0.721555
5  bar    two -0.173215 -0.706771
6  foo    one  0.119209 -1.039575
7  foo  three -1.044236  0.271860

为了进一步探讨,我没有这样做:

print(df.groupby('B').head())

它输出相同的dataFrame,但是当我这样做时:

print(df.groupby('B'))

它给了我这个:

<pandas.core.groupby.DataFrameGroupBy object at 0x7f65a585b390>

这是什么意思?在正常的dataFrame打印中,.head()仅输出前5行,这是什么情况?

还有为什么打印.head()输出与数据帧输出相同?难道不是应该按列的元素分组'B'吗?


问题答案:

当您只使用

df.groupby('A')

你得到一个GroupBy对象。此时您尚未对其应用任何功能。在幕后,虽然这个定义可能并不完美,但是您可以将groupby对象视为:

  • (组,DataFrame) 对的迭代器,用于DataFrame,或
  • 系列(组,系列) 对的迭代器。

为了显示:

df = DataFrame({'A' : [1, 1, 2, 2], 'B' : [1, 2, 3, 4]})
grouped = df.groupby('A')

# each `i` is a tuple of (group, DataFrame)
# so your output here will be a little messy
for i in grouped:
    print(i)
(1,    A  B
0  1  1
1  1  2)
(2,    A  B
2  2  3
3  2  4)

# this version uses multiple counters
# in a single loop.  each `group` is a group, each
# `df` is its corresponding DataFrame
for group, df in grouped:
    print('group of A:', group, '\n')
    print(df, '\n')
group of A: 1

   A  B
0  1  1
1  1  2

group of A: 2

   A  B
2  2  3
3  2  4

# and if you just wanted to visualize the groups,
# your second counter is a "throwaway"
for group, _ in grouped:
    print('group of A:', group, '\n')
group of A: 1

group of A: 2

现在至于.head。只需查看该方法的文档即可:

本质上等同于 .apply(lambda x: x.head(n))

所以在这里,您实际上是在对groupby对象的每个组应用一个函数。请记住,每个组.head(5)适用
于每个组,因此,由于每个组少于或等于5行,因此可以得到原始的DataFrame。

在上面的示例中考虑这一点。如果使用.head(1),则仅获得每个组的第一行:

print(df.groupby('A').head(1))
   A  B
0  1  1
2  2  3


 类似资料:
  • 问题内容: 编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化? 问题答案: 不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。 为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看

  • 问题内容: 我有一个Applet,它使用URLConnection通过HTTP连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然看不到任何缓存行为。我图像的HTTP标头具有合理的缓存设置。如果您查看错误4528599,则有一个相当神秘的陈述: Java插件的当前版本(1.3.1)仅检查浏览器缓存中名称以.jar或.class结尾的文件。我被告知,对于Java Plug-

  • 问题内容: in Pandas中in的功能到底是什么? 问题答案: 当你什么都不懂的时候是你的朋友。它清除了很多次疑问。 看一看: 输出: 当您使用的键将成为新数据框中的索引时。 将列设置为索引时,将获得以下好处: 速度。 当您基于索引列过滤值时,例如 ,因为索引列的散列会更快。不必遍历整个列即可找到。它将只计算的哈希值,并在1 go内找到它。 缓解。 当您可以使用较短和较快的语法,而不是较长和较

  • 问题内容: 首先,我要说我知道它是什么,做什么以及如何使用它。这个问题关系到它在引擎盖下的工作方式,我不希望出现“这就是如何用” 循环数组”的答案。 很长时间以来,我一直认为该方法可用于数组本身。然后,我发现了很多关于它可以与数组 副本 一起使用的事实的引用,从那时起,我一直以为这是故事的结尾。但是我最近对此事进行了讨论,经过一番实验后发现这实际上并非100%正确。 让我表明我的意思。对于以下测试

  • 问题内容: 我经常使用pandas groupby生成堆积表。但是然后我经常想将生成的嵌套关系输出到json。有什么方法可以从生成的堆叠表中提取嵌套的json文件吗? 假设我有一个df,例如: 我可以: 美丽!当然,我真正想做的是通过命令沿着grouped.to_json嵌套嵌套的json。但是该功能不可用。任何解决方法? 所以,我真正想要的是这样的: 唐 问题答案: 我认为熊猫没有内置任何东西可

  • 问题内容: 我有一个包含以下信息的数据框: 我想根据索引插入数据帧中的值, 但仅在每个文件组中 。 插值,我通常会做 和我一起做 我希望插入的数据帧看起来像这样: NaN仍然存在于t = 6的位置,因为它们是file2组中的第一项。 我怀疑我需要使用“应用”,但是还无法确切地知道如何… 任何帮助,将不胜感激。 问题答案: