as_index = False时,groupby.first,groupby.nth,groupby.head有什么区别

发布于 2021-01-29 15:05:14

编辑: 我在np.nan@ coldspeed,@ wen-ben,@
ALollz指出的字符串中犯的菜鸟错误。答案非常好,因此我不会删除此问题以保留这些答案。

原文:
我已经阅读了这个问题/答案groupby.first()和groupby.head(1)有什么区别?

该答案说明差异在于处理NaN价值上。但是,当我打电话给groupbyas_index=False,他们俩都选择了NaN

此外,Pandas具有groupby.nth与和类似的功能head,并且first

有什么差异groupby.first(), groupby.nth(0), groupby.head(1)as_index=False

下面的例子:

In [448]: df
Out[448]:
   A       B
0  1  np.nan
1  1       4
2  1      14
3  2       8
4  2      19
5  2      12

In [449]: df.groupby('A', as_index=False).head(1)
Out[449]:
   A       B
0  1  np.nan
3  2       8

In [450]: df.groupby('A', as_index=False).first()
Out[450]:
   A       B
0  1  np.nan
1  2       8

In [451]: df.groupby('A', as_index=False).nth(0)
Out[451]:
   A       B
0  1  np.nan
3  2       8

我看到`firs()’重置了索引,而其他2则没有。除此之外,还有什么区别吗?

关注者
0
被浏览
95
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    主要问题是您可能'np.nan'存储了字符串,而不是真正的null值。以下是这三个null值的不同处理方式:

    样本数据:

    import pandas as pd
    df = pd.DataFrame({'A': [1,1,2,2,3,3], 'B': [None, '1', np.NaN, '2', 3, 4]})
    

    first

    这将返回每个组中的第一个非空值。奇怪的是它不会跳过None,尽管可以通过kwarg来实现dropna=True。因此,
    您可能会返回原来属于不同行的列的值

    df.groupby('A', as_index=False).first()
    #   A     B
    #0  1  None
    #1  2     2
    #2  3     3
    
    df.groupby('A', as_index=False).first(dropna=True)
    #   A  B
    #0  1  1
    #1  2  2
    #2  3  3
    

    head(n)

    返回组中的前n行。 值保持在行内 。如果您给它的n行数超过了行数,它将返回该组中的所有行而不会抱怨:

    df.groupby('A', as_index=False).head(1)
    #   A     B
    #0  1  None
    #2  2   NaN
    #4  3     3
    
    df.groupby('A', as_index=False).head(200)
    #   A     B
    #0  1  None
    #1  1     1
    #2  2   NaN
    #3  2     2
    #4  3     3
    #5  3     4
    

    nth

    这占用了nth行,因此 再次 保持在row内
    .nth(0)与相同.head(1),但用途不同。例如,如果您需要第0行和第2行,则很难做到.head(),而使用则容易.nth([0,2])。同样,它.head(10)比容易编写.nth(list(range(10))))

    df.groupby('A', as_index=False).nth(0)
    #   A     B
    #0  1  None
    #2  2   NaN
    #4  3     3
    

    nth 还支持删除具有任何空值的行,因此您可以使用它返回不包含任何空值的第一行,这与 .head()

    df.groupby('A', as_index=False).nth(0, dropna='any')
    #   A  B
    #A      
    #1  1  1
    #2  2  2
    #3  3  3
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看