假设有几个类似的 Dataframe ,要对其执行操作,例如删除或重命名列。人们可能希望在循环中执行:
this = pd.DataFrame({'text': ['Hello World']})
that = pd.DataFrame({'text': ['Hello Gurl']})
for df in [this, that]:
df = df.rename(columns={'text': 'content'})
没有引发异常,但是 Dataframe 保持不变。为什么会这样?我如何在 Dataframe 上迭代,而不必输入同一行代码几十次?
另一方面,像创建新列这样的操作确实有效:
for df in [this, that]:
df['content'] = df.text
4条答案
按热度按时间sc4hvdpw1#
使用
inplace=True
调用.rename()
,让它修改DF本身。至于“为什么不修改”,类似于,比如说,
不将
("foo", "blarp")
和("bar", "blarp")
分配回this
和that
。bqf10yzr2#
因为
df.rename
会返回一个新的 Dataframe 。很多pandas的函数也是这样。添加inplace=true
:nfeuvbwi3#
如果你想在原地重命名你的列,你可以使用
rename
方法,并将inplace=True
作为参数,但你也可以直接重命名Index
,因为它不是一个返回副本的方法:输出:
jecbmhm34#
正如其他答案所提到的,
rename
返回一个副本,原始DataFrame没有改变。由于您正在动态创建一个临时列表,因此一旦循环完成,就没有办法获得更新的结果。inplace=True
is harmful in my opinion。所以不要使用它。一些答案建议使用list/dict,对您的代码进行一个小的更改是正确的:
这是有效的,因为
rename
操作的结果被分配回您引用的列表。