为什么数据框上带有中位数的fillna仍然在熊猫中留下Na / NaN?

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

我在这里看到了thisthis线程,但其他地方有问题。

我有一个非常大的熊猫DataFrame,具有许多Na / NaN值。我想用该功能的中间值替换它们。

因此,我首先创建一个显示每个要素的Na值的表,并按大多数Na值进行排序,然后使用fillna(),然后再次显示该表。理想情况下,第二次该表应具有全0,因为所有的Na已被填充。

nullCount = pd.DataFrame(TT_df.isnull().sum(),columns=["nullcount"]).sort_values(by="nullcount",ascending=False)
display(nullCount.head(10))

TT_df = TT_df.fillna(TT_df.median())

nullCount = pd.DataFrame(TT_df.isnull().sum(),columns=["nullcount"]).sort_values(by="nullcount",ascending=False)
display(nullCount.head(10))

但是,我得到了两个表:

null count tables, before and after

并且,如果我看一下DataFrame,您可以在其中看到NaN:

display(TT_df[nullCount.index.tolist()[0:5]].head(50))

NaN examples

似乎fillna()的一个常见问题是,它会返回一个副本,除非您使用inplace = True(例如在上面的链接线程中),但是我正在[[not这样做:我正在覆盖TT_df,除非我误会了。您可以看到LotFrontage功能实际上确实从第二个表中消失了,这意味着fillna()did可以使用它。那为什么它对其他人不起作用?

[我怀疑是罪魁祸首,尽管我不知道为什么,但Na实际上并不是这些功能的Na:如果我查看数据描述文件,它说:

GarageFinish:车库的内部装饰

Fin Finished RFn Rough Finished Unf Unfinished NA No Garage

好的,很好。但是,感觉这些NA值要么对isull()和fillna()都算作Na,要么对两个都不算。为什么它似乎被isull()而不是fillna()计数?
python pandas dataframe series imputation
1个回答
2
投票
问题在于此行:

TT_df = TT_df.fillna(TT_df.median())

您的数据框包含字符串,并且您正在尝试计算字符串的中位数。这不起作用。

这是一个最小的示例:

import pandas as pd, numpy as np df = pd.DataFrame({'A': ['A', 'B', np.nan, 'B']}) df = df.fillna(df.median()) print(df) A 0 A 1 B 2 NaN 3 B

您应该做的是fillna,其中位数仅用于数字列:

for col in df.select_dtypes(include=np.number): df[col] = df[col].fillna(df[col].median())

© www.soinside.com 2019 - 2024. All rights reserved.