无法使用熊猫正确替换空白值

Posted

技术标签:

【中文标题】无法使用熊猫正确替换空白值【英文标题】:Can't properly replace blank values using pandas 【发布时间】:2020-08-15 20:48:38 【问题描述】:

我是 python 初学者,所以我正在使用带有 list of restaurants with a Michelin star (restaurants_df) 的数据框中的 pandas 练习一些数据分析。

例如,当我显示前 5 行时,我注意到在第 4 行的“price”列 (object type) 中有一个空白值:

In [ ]: restaurants_df.head()
Out[ ]:
    name            year    latitude    longitude     city        region    zipCode   cuisine           price
0   Kilian Stuba    2019    47.348580   10.17114   Kleinwalsertal Austria    87568  Creative              $
1   Pfefferschiff   2019    47.837870   13.07917    Hallwang      Austria    5300   Classic cuisine       $
2   Esszimmer       2019    47.806850   13.03409    Salzburg      Austria    5020   Creative              $
3   Carpe Diem      2019    47.800010   13.04006    Salzburg      Austria    5020   Market cuisine        $
4   Edvard          2019    48.216503   16.36852    Wien          Austria    1010   Modern cuisine  

然后我检查每列中有多少 NaN 值。对于 price 列,有 151 个值:

In [ ]: restaurants_df.isnull().sum()
Out[ ]: name           0
        year           0
        latitude       0
        longitude      0
        city           2
        region         0
        zipCode      149
        cuisine        0
        price        151
        dtype: int64

之后,我将这些值替换为字符串"No Price",并确认所有值都已被替换。

In [ ]: restaurants_df["price"].fillna("No Price", inplace = True)
        restaurants_df.isnull().sum()
Out[ ]: name           0
        year           0
        latitude       0
        longitude      0
        city           0
        region         0
        zipCode        0
        cuisine        0
        price          0
        dtype: int64

但是,当我显示前 5 行时,问题仍然存在。

In [ ]: restaurants_df.head()
Out[ ]:
    name            year    latitude    longitude     city        region    zipCode   cuisine           price
0   Kilian Stuba    2019    47.348580   10.17114   Kleinwalsertal Austria    87568  Creative              $
1   Pfefferschiff   2019    47.837870   13.07917    Hallwang      Austria    5300   Classic cuisine       $
2   Esszimmer       2019    47.806850   13.03409    Salzburg      Austria    5020   Creative              $
3   Carpe Diem      2019    47.800010   13.04006    Salzburg      Austria    5020   Market cuisine        $
4   Edvard          2019    48.216503   16.36852    Wien          Austria    1010   Modern cuisine  

知道为什么会发生这种情况以及如何解决吗?提前致谢!

【问题讨论】:

请在您的问题中提供代码,而不是屏幕截图。这将使回答者更容易重现您的问题,而不是手动输入。 很抱歉给您带来不便,我是新来的,正在尝试找出提问的最佳方式。感谢您的提示,我会编辑我的帖子! 请提供minimal reproducible example。除非绝对必要,否则请不要将信息作为图像共享。请参阅:meta.***.com/questions/303812/…、idownvotedbecau.se/imageofcode、idownvotedbecau.se/imageofanexception。 【参考方案1】:

据我了解,您正在处理 空白值空值。这些处理方式不同。查看this question 了解如何处理它们。

【讨论】:

【参考方案2】:

查看kaggle 的数据集显示,前四家餐厅是 5 '$',而第五家是 4 '$'。因此,我猜 jupyter notebook 只是没有在视觉上显示所有的“$”,但是内部的数据是正确的。

要仔细检查我是否正确,请尝试运行

df.price

看看你会得到什么。我认为这可能与 jupyter 的 html 处理程序有关,它试图显示四个美元符号。 You can look at this issue that is similar to yours

如果您对此感到困扰,请使用类似的方式将“$”符号替换为数字

df.replace('price': '$': 1, '$$': 2, '$$$': 3, '$$$$': 4, '$$$$$': 5)

【讨论】:

你是对的!我只是仔细检查了一下,事实上,Jupyther 并没有显示price 列的全部内容。我已经考虑将每组符号转换为数字比例,因此我将继续进行该分析。感谢您的帮助! 嗨@ricardoper9 如果这个或任何答案已经解决了您的问题,请通过单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。 嘿,再次感谢您的提示。当然,我的问题已经解决了,我会接受的!【参考方案3】:

我认为 pandas 不会将带有 '' 的区域识别为空。例如:

df2 = pd.DataFrame(np.array([[1, 2, ''], [4, 5, 6], [7, 8, 9]]),
                   columns=['a', 'b', 'c'])

然后:

df2.isnull()

    a   b   c
0   False   False   False
1   False   False   False
2   False   False   False

查看here,然后尝试:

pandas.options.mode.use_inf_as_na = True

编辑:

您也可以尝试重播:

df2.replace('': 'No Price', inplace=True)

EDIT2:我相信@AKareem 有解决方案,但要扩展您可以使用它来逃避乳胶

restaurants_df.replace('price': 
                       '$': '\$', 
                       '$$': '\$$', 
                       '$$$': '\$$$', 
                       '$$$$': '\$$$$', 
                       '$$$$$': '\$$$$$'
           , inplace=True)

【讨论】:

以上是关于无法使用熊猫正确替换空白值的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中用 NaN 替换空白值(空格)

如果不获取插入功能,则无法找到要使用的正确值

将索引转换为日期时间对象后,MatplotLib 无法正确绘制熊猫时间序列 1 分钟数据

在熊猫数据框中将纪元列值转换为时间

CSS 缩小和捆绑在 calc 中将 0px 替换为 0,因此内容无法正确呈现

如何在熊猫中使用 python 循环替换缺失值? [关闭]