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

And*_* L. 4 python dataframe pandas pandas-groupby

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

原文:
我已阅读此问题/答案groupby.first() 和 groupby.head(1) 之间有什么区别?

该答案解释说差异在于处理NaN价值。然而,当我打电话groupby给时as_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
Run Code Online (Sandbox Code Playgroud)

我看到 `first()' 重置了索引,而其他 2 个则没有。除此之外,还有什么不同吗?

ALo*_*llz 5

主要问题是您可能存储了字符串'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]})
Run Code Online (Sandbox Code Playgroud)

first/last

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

head(n)/tail(n)

返回组内的前/后 n 行。值仍然绑定在 rows 内。如果你给它一个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
Run Code Online (Sandbox Code Playgroud)

nth

这将获取nthrow ,因此值再次保留在 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
Run Code Online (Sandbox Code Playgroud)

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

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