Pandas 均值数据透视表包含 NaN 值,即使在聚合之前填充了数据

Posted

技术标签:

【中文标题】Pandas 均值数据透视表包含 NaN 值,即使在聚合之前填充了数据【英文标题】:Pandas mean pivot table contains NaN values even though data was filled prior to aggregating 【发布时间】:2021-03-15 01:31:39 【问题描述】:

我很难理解这个结果。

我正在使用来自 kaggle 的泰坦尼克号数据集,其中列出了泰坦尼克号的幸存者数据。 “小屋”列中的许多条目都是 NaN,所以我用虚拟变量“Z”填充这些条目。我只对 Cabin 字母感兴趣,所以我通过切片字符串的第一个字符来创建一个新列。然后我按“Sex”和“Cabin_letter”分组,并计算每个舱位中按性别划分的存活率平均值。这是我的代码:

print(train["Cabin"].isnull().sum())
print(train["Sex"].isnull().sum())
print(train["Survived"].isnull().sum())
train["Cabin"].fillna(value="Z", inplace=True)
print(train["Cabin"].isnull().sum())
train["cabin_letter"] = train["Cabin"].str.slice(0,1)
print(train["cabin_letter"].isnull().sum())
train.pivot_table(values = 'Survived', index='Sex', columns='cabin_letter', aggfunc=np.mean)

women_T = train["cabin_letter"].loc[train["Sex"]=="female"]
print(women_T.isnull().any())

我正在打印每个系列中 NaN 值的总和,以确保它不是来自其他地方,并且替换按预期进行。只有 Cabin 列包含 NaN。这是输出:

687

0

0

0

0

cabin_letter    A   B   C   D   E   F   G   T   Z

Sex
                                    
female  1.000000    1.0 0.888889    1.000000    0.933333    1.000   0.5 NaN 0.654378

male    0.428571    0.4 0.343750    0.466667    0.588235    0.375   NaN 0.0 0.136170

False

我可以看到替换正在工作,因为默认情况下没有“Z”值。为什么“G”和“T”列中有 NaN?

对于它的价值,我查看了与类似问题有关的其他 SO 帖子,例如:Pandas Dataframe nan values not replacing

但我看过的似乎都没有解决这个问题。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这表明没有对应于这些组合的值(即 T 舱中没有女性或 G 舱中没有男性)。

你应该可以通过train[train.Cabin == 'T'].Sex.value_counts()确认

这是一个玩具示例,用于说明遵循数据的形式:

dat = pd.DataFrame('sex': list('mfmfmfm'), 
                    'survived': [1, 0, 0, 1, 1, 0, 1], 
                    'cabin': ['a', 'a', 'b', 'b', 'c', 'c', 'd'])
dat
dat.pivot_table(values = 'survived', index='sex', columns = 'cabin', aggfunc=np.mean)

【讨论】:

是的,就是这样,只是想通了。如果没有值,我本来希望它给出 0,但我想我只需要明确地进行替换。

以上是关于Pandas 均值数据透视表包含 NaN 值,即使在聚合之前填充了数据的主要内容,如果未能解决你的问题,请参考以下文章

为熊猫数据透视表中的每个值列定义 aggfunc

Pandas 数据透视表/groupby 计算加权平均值

pandas 数据透视表:通过 aggfunc 计算加权平均值

Python数据分析pandas之分组统计透视表

Python:一次包含重复值的多个列的 Pandas 数据透视表

pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值