Skip to main content
 首页 » 编程设计

python之当 as_index=False 时,groupby.first、groupby.nth、groupby.head 之间有什么不同

2025年05月04日21fff_TT

编辑: @coldspeed、@wen-ben、@ALollz 指出了我在字符串 np.nan 中犯的新手错误。答案很好,所以我不删除这个问题来保留那些答案。

原文:
我读过这个问题/答案 What's the difference between groupby.first() and groupby.head(1)?

该答案解释了差异在于处理 NaN 值。但是,当我用 as_index=False 调用 groupby 时,它们都选择 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 个没有。除此之外,还有什么区别吗?

请您参考如下方法:

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

示例数据:

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

第一个/最后一个

这将返回每个组中的第一个/最后一个非空值。奇怪的是它不会跳过 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 

头(n)/尾(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 

第n个

这采用了 nth 行,因此值再次保持在行内。 .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