首页 > 解决方案 > Pandas 均值数据透视表包含 NaN 值,即使在聚合之前填充了数据

问题描述

我很难理解这个结果。

我正在使用来自 kaggle 的泰坦尼克号数据集,其中列出了泰坦尼克号的幸存者数据。“Cabin”列中的许多条目都是 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 replace

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

任何帮助表示赞赏,谢谢。

标签: pythonpandasnumpydata-sciencekaggle

解决方案


这表明没有对应于这些组合的值(即舱室 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)

推荐阅读