gpt4 book ai didi

python - 如何将 for 循环中的 .pkl 文件 append 到 for 循环中创建的 pandas 数据帧?

转载 作者:行者123 更新时间:2023-12-03 10:08:27 31 4
gpt4 key购买 nike

我有一段看似简单的代码,但不知何故它不起作用。代码的目标是找到一个文件夹中的所有 pickle 数据,在 for 循环中加载第一个作为 pandas 数据框,它被命名为一个以前不存在的变量,如果变量存在,它应该加载剩余的 pickle文件作为 pandas 并将它们 append 到第一个循环中新创建的 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

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

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_DATA.append(pd.read_pickle(i)) 因为您永远不会将其写回 ALL_DATA,所以这些更改是丢弃。您需要将更改分配回去:

ALL_DATA = ALL_DATA.append(pd.read_pickle(i))

但是,在循环中 append 是低效的,因为它会在每次迭代时复制数据,因此您应该避免它。相反, append 到一个列表,这是快速的,然后在循环后 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])

关于python - 如何将 for 循环中的 .pkl 文件 append 到 for 循环中创建的 pandas 数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62543137/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com