使用熊猫时python中的嵌套循环问题
Posted
技术标签:
【中文标题】使用熊猫时python中的嵌套循环问题【英文标题】:Nested loop problem in python while working with pandas 【发布时间】: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" 加载到数据框中。
非常感谢任何帮助/建议。抱歉,如果我的问题需要编辑,*** 有点新。
【问题讨论】:
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 将其可视化...我知道嵌套循环通常是一个坏主意,但我的结果是得到是非常糟糕的
【参考方案1】:
当您的数据框具有非唯一索引或(重复)值时,您会收到该错误。由于您似乎没有使用索引,因此您可以使用以下命令创建一个新索引:
df.reset_index(inplace=True)
或
如果要删除之前的索引。
df.reset_index(drop=True, inplace=True)
为了更深入的了解和参考http://pandas.pydata.org/pandas-docs/stable/indexing.html#set-reset-index会很有用
【讨论】:
感谢您的回复!我试过了,但它仍然只返回最后一次迭代。关于我在这里做错了什么有什么建议吗?也许我把语句放在错误的位置?【参考方案2】:这应该可行:
import json
import pandas as pd
import boto3
client = boto3.client('s3')
var = "filename"
filenumber = ["0", "1", "2","3"]
df_list = []
for subdir in filenumber:
response = client.list_objects(Bucket="bucketname", Prefix=f"subfolder/var/subdir")
for file in response["Contents"]:
obj = client.get_object(Bucket="bucketname", Key=file["Key"])
print(file["Key"])
df_list.append(pd.read_json(obj["Body"]))
df = pd.concat(df_list)
result = df.to_json(orient="records")
parsed = json.loads(result)
print(json.dumps(parsed, indent=4))
【讨论】:
以上是关于使用熊猫时python中的嵌套循环问题的主要内容,如果未能解决你的问题,请参考以下文章