Создание нескольких фреймов данных одновременно в цикле for

1

У меня есть сценарий, который проверяет функции в базе данных ГИС для отсутствия значений в полях. Если значение отсутствует, оно добавляется к кадру данных, причем верхний столбец является именем функции. В идеале я хотел бы разделить это так, чтобы имя функции стало именем листа, но я не уверен, как это сделать итеративно. Следует отметить, что не каждая функция будет иметь недостающее значение, разные функции в разное время могут иметь или не иметь отсутствующее значение, что точка выполнения этой проверки.

df = pd.DataFrame()

for dst, dstkey in zip(Dst, DstKey):
    with arcpy.da.SearchCursor(dst, ("OBJECTID", dstkey)) as cursor:
        #returns an iterator of tuples
        for row in cursor:
            if (row[1] is None or not str(row[1]).strip()):
                df = df.append(pd.DataFrame({dst.split("\\").pop(): str(row[0])}, index=[0]), ignore_index=True)

Это возвращает мне единый блок данных. В идеале я бы хотел, чтобы несколько файлов данных экспортировались в Excel с dst качестве имени sheet_name. Проблема в том, что я не буду знать, сколько (если есть) функций будет иметь пустое значение.

Я попытался создать пустой блок данных для каждой функции, но я не могу понять, как это будет работать в вышеупомянутом блоке кода.

d = {dst.split("\\").pop().split(".")[2]: pd.DataFrame() for dst in Dst}

Стоит отметить, что Dst - это список путей к базе данных SQL, а DstKey - это поле в каждой базе данных, которую я проверяю.

Теги:
pandas
dataframe
python-3.x

1 ответ

1
Лучший ответ

Подумайте о том, как использовать словарь данных с dst в качестве ключевого здания для внутреннего списка кадров данных, которые объединены вне цикла:

df_dict = {}

for dst, dstkey in zip(Dst, DstKey):
    inner = []
    with arcpy.da.SearchCursor(dst, ("OBJECTID", dstkey)) as cursor:
        # returns an iterator of tuples
        for row in cursor:
            if (row[1] is None or not str(row[1]).strip()):
                inner.append(pd.DataFrame({dst.split("\\").pop(): str(row[0])}, index=[0])

    df_dict[dstkey] = pd.concat(inner, ignore_index=True)

Альтернативно со списком:

df_dict = {}

for dst, dstkey in zip(Dst, DstKey):
    with arcpy.da.SearchCursor(dst, ("OBJECTID", dstkey)) as cursor:
        # returns an iterator of tuples
        inner = [pd.DataFrame({dst.split("\\").pop(): str(row[0])}, index=[0]) 
                 for row in cursor if (row[1] is None or not str(row[1]).strip())]

    df_dict[dstkey] = pd.concat(inner, ignore_index=True)

Экспорт Excel с использованием словаря данных:

writer = pd.ExcelWriter('/path/to/output.xlsx')

for i, df in df_dict.items():
   df.to_excel(writer, sheet_name=i)

writer.save()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню