使用熊猫时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中的嵌套循环问题的主要内容,如果未能解决你的问题,请参考以下文章

嵌套for循环熊猫数据框不会创建新列

Python中的嵌套循环

一文了解Python中的循环(for while break continue 嵌套循环...)

理解python中嵌套while循环中的概念的问题

求大神支招,python循环打印两个嵌套列表组合

Python:在“while”循环中嵌套“If”语句?