将聚合应用于分组的 pandas DataFrame 时,聚合输出似乎包含聚合的所有缺失值列的不同值,具体取决于数据帧列的类型。下面是一个最小的示例,其中包含一个非缺失值(一个整数、一个字符串和一个元组)、一个
NaN
和一个 None
:
import pandas as pd
import numpy as np
a1 = pd.DataFrame({'a': [3, np.nan, None], 'b': [0,1,2]})
a2 = pd.DataFrame({'a': ['tree', np.nan, None], 'b': [0,1,2]})
a3 = pd.DataFrame({'a': [(0,1,2), np.nan, None], 'b': [0,1,2]})
a1.groupby('b')['a'].first()
a2.groupby('b')['a'].first()
a3.groupby('b')['a'].first()
a1.groupby('b')['a'].agg('first')
a2.groupby('b')['a'].agg('first')
a3.groupby('b')['a'].agg('first')
查看
dtypes
列的'a'
,可以看出,对于float64
、object
和object
,分别是a1
、a2
和a3
。 None
中的 a1
在数据帧创建时转换为 NaN
。因此我会有以下
预期输出行为:
a1
:第 1 行和第 2 行NaN
(就是这种情况)a2
:第 1 行和第 2 行的 NaN
和 None
(并非如此)a3
:第 1 行和第 2 行的 NaN
和 None
(并非如此)实际产量:
b
0 3.0
1 NaN
2 NaN
Name: a, dtype: float64
b
0 tree
1 None
2 None
Name: a, dtype: object
b
0 (0, 1, 2)
1 None
2 None
Name: a, dtype: object
为什么聚合会将
NaN
和None
中第1行的数据从a2
更改为a3
?由于该列无论如何都是dtype对象,因此返回NaN
和None
分别表示第 1 行和第 2 行;我们这里的场景并不是任何要聚合的组都包含 NaNs
和 None
。文档(https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.DataFrameGroupBy.first.html)对于这种行为也不是很精确,它只是提到了所有的返回值-NA-列是 NA。
groupby.first
会删除 NaN,您应该使用 skipna=False
:
a2.groupby('b')['a'].first(skipna=False)
输出:
b
0 tree
1 NaN
2 None
Name: a, dtype: object