Python 熊猫:Can';t追加并重新分配到函数内的数据帧
我想做的是将数据帧作为参数附加到函数中,类似于下面代码中按函数执行的操作Python 熊猫:Can';t追加并重新分配到函数内的数据帧,python,pandas,Python,Pandas,我想做的是将数据帧作为参数附加到函数中,类似于下面代码中按函数执行的操作f df = pd.DataFrame(data=[(0,1), (0,1)], columns=['a', 'b']) df Out[58]: a b 0 0 1 1 0 1 def f(df): df['a'] = 1 # The first column will be modified # However the following will have no effect
f
df = pd.DataFrame(data=[(0,1), (0,1)], columns=['a', 'b'])
df
Out[58]:
a b
0 0 1
1 0 1
def f(df):
df['a'] = 1 # The first column will be modified
# However the following will have no effect
df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b']))
f(df)
df
# As we see `append` didn't have an effect on the df
Out[61]:
a b
0 1 1
1 1 1
正如我们从上面的代码中看到的,append
如果不返回数据帧,则没有任何效果。这有什么原因吗
编辑:
我想我写了这个问题后就明白了原因。由于append
会在新对象未返回时创建一个新对象,因此分配
df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b']))
将只将新数据帧传递给
df
引用的副本,即通过函数调用生成的副本,而不传递给原始df
。因此,新的数据帧丢失。您似乎忘记了返回df
:
def f(df):
df['a'] = 1 # The first column will be modified
# However the following will have no effect
df = df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b']))
return df
print (f(df))
a b
0 1 1
1 1 1
0 0 1
或者更好:
def f(df):
df['a'] = 1 # The first column will be modified
return df.append(pd.DataFrame(data=[(0, 1)], columns=['a', 'b']), ignore_index=True)
print (f(df))
a b
0 1 1
1 1 1
2 0 1
我认为如果选中它,则返回新的
对象
,因此返回
是必要的。是的,我是故意这样做的,因为我试图查看通过引用传递数据帧是否会在重新分配数据帧时产生影响。正如它在文章中所说的“正如我们从上面的代码中看到的,如果数据帧没有返回,append就没有效果。有什么原因会发生这种情况吗?”我认为如果检查它是否返回新对象,那么return
就有必要了,因此,新对象是易变的,尽管它被分配给函数参数,但仍然会丢失。不幸的是,我无法更好地解释它,但作为解释,没有就地参数,因此此函数无法就地工作。我想我在经过一点思考后找到了答案,请参阅我的编辑。无论如何,谢谢你。APPEND不在现场运行。它创建了一个新的数据帧。如果不使用返回的对象,则将保留相同的数据帧。