我有一个非常大的熊猫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))
似乎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()计数?
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())