У меня есть сценарий, который проверяет функции в базе данных ГИС для отсутствия значений в полях. Если значение отсутствует, оно добавляется к кадру данных, причем верхний столбец является именем функции. В идеале я хотел бы разделить это так, чтобы имя функции стало именем листа, но я не уверен, как это сделать итеративно. Следует отметить, что не каждая функция будет иметь недостающее значение, разные функции в разное время могут иметь или не иметь отсутствующее значение, что точка выполнения этой проверки.
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
- это поле в каждой базе данных, которую я проверяю.
Подумайте о том, как использовать словарь данных с 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()