Python 如何将for循环中的.pkl文件附加到for循环中创建的数据帧中?

Python 如何将for循环中的.pkl文件附加到for循环中创建的数据帧中?,python,pandas,for-loop,append,pickle,Python,Pandas,For Loop,Append,Pickle,我有一段看似简单的代码,但不知何故它不起作用。代码的目标是查找文件夹中的所有pickle数据,将for循环中的第一个作为pandas数据帧加载,该数据帧在以前不存在的变量下命名,如果该变量存在,则应将其余pickle文件作为pandas加载,并将其附加到第一个循环中新创建的pandas数据帧: import pandas as pd import os # Creating the first Dataframe using dictionary df1 = pd.DataFrame({&

我有一段看似简单的代码,但不知何故它不起作用。代码的目标是查找文件夹中的所有pickle数据,将for循环中的第一个作为pandas数据帧加载,该数据帧在以前不存在的变量下命名,如果该变量存在,则应将其余pickle文件作为pandas加载,并将其附加到第一个循环中新创建的pandas数据帧:

import pandas as pd
import os

# Creating the first Dataframe using dictionary 
df1  = pd.DataFrame({"a":[1, 2, 3, 4], 
                         "b":[5, 6, 7, 8]}) 
  
# Creating the Second Dataframe using dictionary 
df2 = pd.DataFrame({"a":[1, 2, 3], 
                    "b":[5, 6, 7]}) 


df1.append(df2) 
作品精细印刷:

    a   b
0   1   5
1   2   6
2   3   7
3   4   8
0   1   5
1   2   6
2   3   7

但是,当我尝试将存储的pickle文件中的数据帧附加到for循环中时,它不会打印错误,但只适用于第一个数据帧:

df1.to_pickle("DF1.pkl")
df2.to_pickle("DF2.pkl")

files = [f for f in os.listdir('.') if os.path.isfile(f)]
#The line above should produce the line below
files=["DF1.pkl", "DF2.pkl"]

for i in files:
    if ".pkl" in i:
        if "ALL_DATA" not in globals():
            ALL_DATA=pd.read_pickle(i)
        else:
            ALL_DATA.append(pd.read_pickle(i))
仅打印:

a   b
0   1   5
1   2   6
2   3   7
3   4   8


谁能帮我澄清一下?

DataFrame.append
返回一个新对象,因此尽管您调用了
ALL\u DATA.append(pd.read\u pickle(i))
,因为您从未将其写回所有\u数据,这些更改将被丢弃。您需要重新分配更改:

ALL_DATA = ALL_DATA.append(pd.read_pickle(i))
然而,在循环中追加是低效的,因为它会在每次迭代时复制数据,所以您应该避免它。相反,将其附加到一个快速的列表中,然后在循环后执行一次
concat

l = [] # Holds everything you may possibly append
for i in files:
    if ".pkl" in i:
        if "ALL_DATA" not in globals():
            ALL_DATA=pd.read_pickle(i)
        else:
            l.append(pd.read_pickle(i)) # List append which modifies `l`

# Create df from ALL_DATA and everything that you append
ALL_DATA = pd.concat([ALL_DATA, *l])

谢谢,这很有效。我确实没有意识到df.append会返回一个新对象。由于包含pickles的文件夹很大,因此您更高效的解决方案非常有用:)。