【问题标题】:Nested loop problem in python while working with pandas使用熊猫时python中的嵌套循环问题
【发布时间】: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


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2015-11-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多