Создание нескольких фреймов данных одновременно в цикле for - PullRequest
0 голосов
/ 17 октября 2018

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

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 - это поле в каждой базе данных, для которой я проверяю.

1 Ответ

0 голосов
/ 18 октября 2018

Рассмотрите возможность использования словаря фреймов данных с 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...