【发布时间】:2021-07-03 22:42:27
【问题描述】:
我正在尝试创建一个嵌套循环以在 s3 存储桶中加载多个文件并将它们连接到一个数据帧中。为了做到这一点,我在安排嵌套循环时遇到了麻烦。 这是我的代码:
import json
import pandas as pd
import boto3
import io
client = boto3.client('s3')
var = "filename"
filenumber = ["/0", "/1", "/2","/3"]
for j in range(len(filenumber)):
response = client.list_objects(Bucket="bucketname", Prefix="subfolder/%s" % (var + filenumber[j]))
df_list = []
json_buffer = io.StringIO()
for file in response["Contents"]:
obj = client.get_object(Bucket="bucketname", Key=file["Key"])
obj_df = pd.read_json(obj["Body"])
df_list.append(obj_df)
df = pd.concat(df_list)
df.to_json(json_buffer)
将df = pd.concat(df_list) 保持在外循环内,我得到错误:DataFrame index must be unique for orient='columns'
如果我将行保留在外循环之外,我只会从列表中获取最后一个迭代文件,即。 "/3" 加载到数据框中。
非常感谢任何帮助/建议。抱歉,如果我的问题需要编辑,stackoverflow 有点新。
【问题讨论】:
-
DataFrame 是一个可变变量。尝试将
obj_df = pd.read_json(obj["Body"])和df_list.append(obj_df)两行更改为df_list.append(pd.read_json(obj["Body"])) -
感谢您的回复!但是循环仍然只是返回最后一次迭代,即。 “/3”。我希望将所有迭代一一附加到数据帧中。
-
哦。在循环之前初始化 df_list (
df_list = []) 并在范围循环之后将其连接起来。 -
我试过了,但无济于事,所以我剥离了我的代码并尝试使用 pythontutor.com/visualize.html 将其可视化...我知道嵌套循环通常是一个坏主意,但我的结果是得到是非常糟糕的
标签: python pandas list loops boto3