这点之前已经讨论过,但答案相互矛盾:
我想知道的是:
inplace = False 是默认行为?inplace = True 而失败/行为不端?inplace = True 操作是否会“真的”就地执行?inplace 参数,始终默认为 False,这意味着原始 DataFrame 未被触及,并且该操作返回一个新的 DF。inplace = True 时,操作可能对原始 DF 起作用,但它仍可能对幕后的副本起作用,并且只需重新分配引用完成。inplace = True 的优点:reset_index() 运行速度是原来的两倍,并且使用了峰值内存的一半!)。inplace = False 的优点:df.dropna().rename().sum()... 这很好,并提供了延迟评估或更有效的重新排序的机会(虽然我不认为 Pandas 会这样做)。inplace = True 时,Pandas 必须进行 SettingWithCopy 检查,这很昂贵。 inplace = False 避免了这种情况。因此,抛开复制与 View 的问题,总是使用 inplace = True 似乎更高效,除非专门编写链式语句。但这不是 Pandas 的默认选择,所以我错过了什么?
最佳答案
In pandas, is inplace = True considered harmful, or not?
是的,是的。不仅有害。 相当有害。 This GitHub issue提议在不久的将来某个时候在 API 范围内弃用 inplace 参数。简而言之,这就是 inplace 参数的所有问题:
inplace,与顾名思义相反,通常不会阻止创建副本,并且(几乎)从不提供任何性能优势inplace 不适用于方法链接inplace 在 DataFrame 列上调用时会导致可怕的 SettingWithCopyWarning,并且有时可能无法就地更新列以上痛点都是初学者常见的陷阱,所以去掉这个选项会大大简化API。
我们更深入地了解以上几点。
性能
一个常见的误解是使用 inplace=True 会导致更高效或优化的代码。一般来说,使用 inplace=True没有性能优势(但也有少数异常(exception)情况,这些异常(exception)情况主要是库中的实现细节造成的,不应用作支持为这个论点的用法的拐杖)。大多数就地和非就地版本的方法无论如何都会创建数据的副本,而就地版本会自动将副本分配回去。复制是无法避免的。
方法链
inplace=True 也阻碍方法链接。对比工作
result = df.some_function1().reset_index().some_function2()
相对
temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()
意外的陷阱
最后要记住的一个警告是调用 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
这会导致意外行为。
关于python - 在 Pandas 中,inplace = True 是否被认为是有害的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45570984/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub