为什么不能迭代pandas Dataframe ?

o0lyfsai  于 2023-04-19  发布在  其他
关注(0)|答案(4)|浏览(128)

假设有几个类似的 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
sc4hvdpw

sc4hvdpw1#

使用inplace=True调用.rename(),让它修改DF本身。

this = pd.DataFrame({'text': ['Hello World']})
that = pd.DataFrame({'text': ['Hello Gurl']})

for df in [this, that]:
    df.rename(columns={'text': 'content'}, inplace=True)

至于“为什么不修改”,类似于,比如说,

this = ("foo",)
that = ("bar",)

for x in (this, that):
    x = x + ("blarp",)

不将("foo", "blarp")("bar", "blarp")分配回thisthat

bqf10yzr

bqf10yzr2#

因为df.rename会返回一个新的 Dataframe 。很多pandas的函数也是这样。添加inplace=true

for df in [this, that]:
    df.rename(columns={'text': 'content'}, inplace=True)
nfeuvbwi

nfeuvbwi3#

如果你想在原地重命名你的列,你可以使用rename方法,并将inplace=True作为参数,但你也可以直接重命名Index,因为它不是一个返回副本的方法:

d = {'text': 'content'}

for df in [this, that]:
    df.columns = [d.get(col, col) for col in df.columns]

输出:

>>> this
       content
0  Hello World

>>> that
      content
0  Hello Gurl
jecbmhm3

jecbmhm34#

正如其他答案所提到的,rename返回一个副本,原始DataFrame没有改变。由于您正在动态创建一个临时列表,因此一旦循环完成,就没有办法获得更新的结果。

inplace=True is harmful in my opinion

所以不要使用它。一些答案建议使用list/dict,对您的代码进行一个小的更改是正确的:

dfs = [this, that]
for i in range(len(dfs)):
    dfs[i] = dfs[i].rename(...) # do something with dfs[i] and assign it back
# unpack the result
this, that = dfs

这是有效的,因为rename操作的结果被分配回您引用的列表。

相关问题