问题:了解inplace = True
在pandas
库中多次出现改变就地等物体的方式与下面的语句一个选项…
df.dropna(axis='index', how='all', inplace=True)
我很好奇返回的内容以及inplace=True
传递时与传递对象时如何处理该对象inplace=False
。
所有操作self
何时都在修改inplace=True
?何时inplace=False
立即创建一个新对象,例如new_df = self
然后new_df
返回?
回答 0
如果inplace=True
通过,该数据被重命名到位(它没有返回值),所以你会使用:
df.an_operation(inplace=True)
当inplace=False
传递(这是默认值,所以没有必要),执行操作,并返回该对象的副本,所以你会使用:
df = df.an_operation(inplace=False)
回答 1
在大熊猫中,inplace = True是否有害?
TLDR;是的,是的。
inplace
,顾名思义,通常不会阻止创建副本,并且(几乎)从不提供任何性能优势inplace
不适用于方法链接inplace
对于初学者来说是一个常见的陷阱,因此删除此选项将简化API
我不建议设置此参数,因为它的作用很小。请参阅此GitHub问题,其中建议在inplace
api范围内弃用该参数。
一个普遍的误解是,使用inplace=True
会导致更高效或更优化的代码。实际上,使用绝对没有性能上的好处inplace=True
。无论是就地和外的地方版本创建数据的副本无论如何,与就地版本自动分配拷贝回来。
inplace=True
对于初学者来说是一个常见的陷阱。例如,它可以触发SettingWithCopyWarning
:
df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})
df2 = df[df['a'] > 1]
df2['b'].replace({'x': 'abc'}, inplace=True)
# SettingWithCopyWarning:
# A value is trying to be set on a copy of a slice from a DataFrame
使用inplace=True
可能会或可能不会在DataFrame列上调用函数。当涉及链式索引时,尤其如此。
似乎上述问题还不够,inplace=True
也阻碍了方法链接。对比一下
result = df.some_function1().reset_index().some_function2()
相对于
temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()
前者有助于更好的代码组织和可读性。
另一个支持的说法是,set_axis
最近更改了API,以便将inplace
默认值从True切换为False。参见GH27600。出色的开发人员!
回答 2
我使用它的方式是
# Have to assign back to dataframe (because it is a new copy)
df = df.some_operation(inplace=False)
要么
# No need to assign back to dataframe (because it is on the same copy)
df.some_operation(inplace=True)
结论:
if inplace is False
Assign to a new variable;
else
No need to assign
回答 3
该inplace
参数:
df.dropna(axis='index', how='all', inplace=True)
在Pandas
与一般的手段:
1.熊猫创建原始数据的副本
2. …对它进行一些计算
3. …将结果分配给原始数据。
4. …删除副本。
正如你在我的答案其余阅读下面的进一步,我们还可以有充分的理由来使用此参数即inplace operations
,但如果能,我们应该避免,因为它产生更多的问题,如:
1.您的代码将更难调试(实际上,SettingwithCopyWarning表示警告您可能出现的问题)
2.与方法链冲突
因此,甚至在某些情况下我们应该使用它吗?
绝对可以。如果我们使用熊猫或任何工具处理庞大的数据集,我们很容易面对这样的情况,即一些大数据会消耗我们的整个内存。为了避免这种不良影响,我们可以使用诸如方法链接之类的一些技术:
(
wine.rename(columns={"color_intensity": "ci"})
.assign(color_filter=lambda x: np.where((x.hue > 1) & (x.ci > 7), 1, 0))
.query("alcohol > 14 and color_filter == 1")
.sort_values("alcohol", ascending=False)
.reset_index(drop=True)
.loc[:, ["alcohol", "ci", "hue"]]
)
这使我们的代码更紧凑(尽管也更难以解释和调试),并且由于链接的方法与另一种方法的返回值一起使用而占用的内存更少,因此仅产生输入数据的一个副本。我们可以清楚地看到,执行此操作后,我们将有2倍的原始数据内存消耗。
或者我们可以使用inplace
参数(尽管也更难解释和调试),我们的内存消耗将是原始数据的2倍,但是此操作后的内存消耗仍然是原始数据的1倍,如果有人每次使用庞大的数据集时都确切知道这可能是一个原始数据,大收益。
定论:
避免使用inplace
参数,除非您不使用大量数据,并且在仍然使用它的情况下要注意其可能的问题。
回答 4
将其保存到相同的变量
data["column01"].where(data["column01"]< 5, inplace=True)
将其保存到单独的变量
data["column02"] = data["column01"].where(data["column1"]< 5)
但是,您始终可以覆盖变量
data["column01"] = data["column01"].where(data["column1"]< 5)
仅供参考:默认 inplace = False
回答 5
当尝试使用函数对Pandas数据框进行更改时,如果要将更改提交到数据框,则使用“ inplace = True”。因此,以下代码中的第一行将“ df”中第一列的名称更改为“ Grades”。如果要查看生成的数据库,我们需要调用数据库。
df.rename(columns={0: 'Grades'}, inplace=True)
df
当我们不想提交更改而只打印结果数据库时,我们使用’inplace = False’(这也是默认值)。因此,实际上是在不更改原始数据库的情况下打印具有已提交更改的原始数据库的副本。
为了更清楚一点,以下代码执行相同的操作:
#Code 1
df.rename(columns={0: 'Grades'}, inplace=True)
#Code 2
df=df.rename(columns={0: 'Grades'}, inplace=False}
回答 6
inplace=True
是否使用取决于您是否要更改原始df。
df.drop_duplicates()
将仅查看丢弃的值,而不会对df进行任何更改
df.drop_duplicates(inplace = True)
将删除值并更改df。
希望这可以帮助。:)
回答 7
inplace=True
使功能不纯。它更改原始数据框并返回无。在这种情况下,您会中断DSL链。由于大多数数据框功能都返回一个新的数据框,因此可以方便地使用DSL。喜欢
df.sort_values().rename().to_csv()
inplace=True
返回值为None的函数调用,并且DSL链断开。例如
df.sort_values(inplace=True).rename().to_csv()
会抛出 NoneType object has no attribute 'rename'
与python的内置排序和排序类似。lst.sort()
返回None
并sorted(lst)
返回一个新列表。
通常,inplace=True
除非有特殊原因,否则请勿使用。当您必须编写类似的重新分配代码时df = df.sort_values()
,请尝试将函数调用附加到DSL链中,例如
df = pd.read_csv().sort_values()...
回答 8
就我在大熊猫方面的经验而言,我想回答一下。
‘inplace = True’参数代表数据帧必须永久更改,例如。
df.dropna(axis='index', how='all', inplace=True)
更改相同的数据框(因为这只大熊猫在索引中找到NaN条目并将其删除)。如果我们尝试
df.dropna(axis='index', how='all')
熊猫显示了我们进行了更改的数据框,但不会修改原始数据框“ df”。
回答 9
如果您不使用inplace = True或使用inplace = False,则基本上可以得到一个副本。
因此,例如:
testdf.sort_values(inplace=True, by='volume', ascending=False)
会改变结构,数据按降序排列。
然后:
testdf2 = testdf.sort_values( by='volume', ascending=True)
将使testdf2成为副本。值将全部相同,但排序将颠倒,您将拥有一个独立的对象。
然后在另一列中,说出LongMA,您可以:
testdf2.LongMA = testdf2.LongMA -1
testdf中的LongMA列将保留原始值,而testdf2列将减少值。
随着计算链的增长以及数据帧的副本具有其自己的生命周期,跟踪差异至关重要。
回答 10
是的,在Pandas中,我们有很多具有参数的函数,inplace
但默认情况下将其分配给False
。
因此,当您执行df.dropna(axis='index', how='all', inplace=False)
此操作时,它认为您不想更改orignial DataFrame
,因此它会为您创建具有所需更改的新副本。
但是,当您将inplace
参数更改为True
然后,这等效于明确地说,我不需要新的副本,
DataFrame
而是对给定的内容进行更改DataFrame
这迫使Python解释器不要创建新的DataFrame
但是您也可以inplace
通过将结果重新分配给原始DataFrame来避免使用参数
df = df.dropna(axis='index', how='all')