Pandas 聚合数据框中的缺失值表示

问题描述 投票:0回答:1

将聚合应用于分组的 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。

python pandas aggregate nan nonetype
1个回答
0
投票

默认情况下,

groupby.first
会删除 NaN,您应该使用
skipna=False
:

a2.groupby('b')['a'].first(skipna=False)

输出:

b
0    tree
1     NaN
2    None
Name: a, dtype: object
© www.soinside.com 2019 - 2024. All rights reserved.