Python 使用数据帧列表

Python 使用数据帧列表,python,pandas,Python,Pandas,在使用熊猫数据帧和列表时,我注意到代码的行为有些奇怪。我不知道它们是否相关,或者问题是否来自我无法理解的东西。如果有人能解释一下原因,我将不胜感激。我的代码类似于以下示例: list_of_df=[] for i in range(0,5): df=a_function(data) list_of_df.append(df) a_函数正在获取名为“data”的初始数据帧,修改它并返回它。这是一个愚蠢的例子,但基本上显示了我正在进行的操作: def a_function(data

在使用熊猫数据帧和列表时,我注意到代码的行为有些奇怪。我不知道它们是否相关,或者问题是否来自我无法理解的东西。如果有人能解释一下原因,我将不胜感激。我的代码类似于以下示例:

list_of_df=[]
for i in range(0,5):
    df=a_function(data)
    list_of_df.append(df)
a_函数
正在获取名为“data”的初始数据帧,修改它并返回它。这是一个愚蠢的例子,但基本上显示了我正在进行的操作:

def a_function(data):
    data[new_column]=1
    data.loc[:,existing_column]=0
    return data
我期望的结果是,列表_of_df是一个不同数据帧的列表,但是我最终得到的所有数据帧都是相同的,并且与最后附加的数据帧相同

当我使用以下变通方法时,代码按预期工作:

list_of_df=[]
for i in range(0,5):
    df=data.copy()
    df=a_function(df)
    list_of_df.append(df)
但我不知道为什么。谢谢你的帮助


编辑:有关函数在数据帧上执行的操作的更多信息在第一个实例中,您只需修改单个数据帧对象实例。这与vanilla Python的工作方式没有什么不同。我不确定是否有好的复制,但可能从开始。使用Pandas/Numpy可能会更复杂,因为某些操作会自动创建对象的副本,而其他操作会返回原始对象的“视图”,例如。很难具体说明这一点,因为你还没有给出你正在做的事情的例子。创建副本的成本很高,因此,在可能的情况下,库将尝试允许您对原始对象进行操作,将复制权留给您。这是一个大问题,因为您需要确保函数返回副本。但这主要是一个Python问题,@roganjosh的链接解释了这一点。这是我们能得到的最接近欺骗目标的@roganjosh谢谢你的回答,我现在理解得更好了。在函数中,我基本上只是使用
.loc
访问器修改列。问题是,我认为在python中参数是通过值传递给函数的。因此,我假设在我的函数中处理“数据”时,它已经是一个副本。@Bravo1否,如果参数是可变的(如列表、字典或数据帧),则可以在函数中修改它。它不是复制品。