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 值,即使在聚合之前填充了数据的主要内容,如果未能解决你的问题,请参考以下文章
pandas 数据透视表:通过 aggfunc 计算加权平均值
Python:一次包含重复值的多个列的 Pandas 数据透视表
pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值