gpt4 book ai didi

python - inplace=True 不适用于子集数据

转载 作者:行者123 更新时间:2023-12-04 12:32:06 25 4
gpt4 key购买 nike

我正在尝试填充行子集中的缺失值。我在 fillna() 中使用了 inplace=True,但它在 jupyter notebook 中不起作用。您可以在 Surface 列的前两行看到显示 NaN 的附图。我不确定为什么?

我必须这样做才能正常工作。为什么?感谢您的帮助。

data.loc[mark,'Surface']=data.loc[mark,'Surface'].fillna(value='TEST')

这是我的代码

mark=(data['Pad']==51) | (data['Pad']==52) | (data['Pad']==53) | (data['Pad']==54) | (data['Pad']==55)

data.loc[mark,'Surface'].fillna(value='TEST',inplace=True)

这个正在工作:

data.loc[mark,'Surface']=data.loc[mark,'Surface'].fillna(value='TEST')

enter image description here

最佳答案

您在这里遇到的主要问题是 pandas 没有非常明确的 View 与复制规则。您的结果向我表明这里的问题是 .loc 返回的是副本而不是 View 。虽然 pandas 确实尝试从 .loc 返回一个 View ,但也有很多警告。

玩了一会儿之后,似乎使用 bool /位置索引掩码返回一个副本 - 您可以使用私有(private) _is_view 属性验证这一点:

import pandas as pd
import numpy as np

df = pd.DataFrame({"Pad": range(40, 60), "Surface": np.nan})

print(df)
Pad Surface
0 40 NaN
1 41 NaN
2 42 NaN
. ... ...
19 59 NaN


# Create masks
bool_mask = df["Pad"].isin(range(51, 56))
positional_mask = np.where(bool_mask)[0]

# Check `_is_view` after simple .loc:
>>> df.loc[bool_mask, "Surface"]._is_view
False

>>> df.loc[positional_mask, "Surface"]._is_view
False

因此,上述两种方法都不会返回原始数据的“ View ”,这就是执行 inplace 操作不会更改原始数据帧的原因。为了从 .loc 返回 View ,您需要使用切片作为行索引。

>>> df.loc[10:15, "Surface"]._is_view
True

现在这仍然无法解决您的问题,因为您填充 NaN 的值可能会也可能不会更改“Surface”列的 dtype。在我设置的示例中,“Surface”具有 float64 dtype- 并且通过使用值“Test”填充 NaN,您强制更改与原始数据帧不兼容的 dtype。如果您的“表面”列是 object dtype,那么您无需担心这一点。

>>> df.dtypes
Pad int64
Surface float64

# this does not work because "Test" is incompatible with float64 dtype
>>> df.loc[10:15, "Surface"].fillna("Test", inplace=True)

# this works because 0.9 is an appropriate value for a float64 dtype
>>> df.loc[10:15, "Surface"].fillna(0.9, inplace=True)
>>> print(df)
Pad Surface
.. ... ...
8 48 NaN
9 49 NaN
10 50 0.9
11 51 0.9
12 52 0.9
13 53 0.9
14 54 0.9
15 55 0.9
16 56 NaN
17 57 NaN
.. ... ...

TLDR;一般来说,不要依赖 pandas 中的 inplace。在其大部分操作中,它仍然会创建基础数据的副本,然后 attempts to replace the original source with the new copy . Pandas 的内存效率不高,所以如果你担心内存性能,你可能想切换到设计为从头开始零复制的东西,比如 Vaex ,而不是尝试通过 pandas。

您分配数据帧切片的方法是最合适的,并且将确保您收到尽可能“就地”更新数据帧的正确结果:

>>> df.loc[bool_mask, "Surface"] = df.loc[bool_mask, "Surface"].fillna("Test")

关于python - inplace=True 不适用于子集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68352823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com