Как пропустить пустой фрейм данных в цикле и сохранить объединенный результат

#python-3.x #pandas

Вопрос:

У меня есть файлы Excel с тремя одинаковыми вкладками. Я прошелся по всем файлам excel в каталоге и создал отдельный фрейм данных для каждой вкладки. После некоторой очистки каждого фрейма данных я объединил три фрейма данных в один и сохранил на новом листе.

В общем, мой код работает, но он возвращает ошибку, когда одна(или несколько) вкладок в excels пусты.

Например, каждый файл Excel имеет три вкладки: data1, data2 и data3, и я считываю каждую вкладку в отдельный фрейм данных: df_1, df_2 и df_3. Однако в некоторых файлах есть только некоторые из трех вкладок, а не все, и я думаю, что в этом случае мой код нарушается.

Как мне обновить свой код, чтобы решить эту проблему? Я хочу проверить, пуста вкладка или нет, и импортировать ее, если она не пуста. В конце концов, я все равно хотел бы объединить все фреймы данных. Например, если файл Excel содержит только вкладки data1 и data3, конечным фреймом данных будет df_1 df_3.

 datapath = r"C:UsersDocumentssample"
excel_files = glob.glob(datapath   '*.xlsx')

for excel in excel_files:
    df_1 = pd.read_excel(excel, sheet_name="data1", header=None)
    df_2 = pd.read_excel(excel, sheet_name="data2", header=None)
    df_3 = pd.read_excel(excel, sheet_name="data3", header=None)

    df_1.rename(columns={0:'ID_Num'}, inplace = True)
    df_1 = df_bon.groupby(["ID_Num"]).size().reset_index(name='Count')
    df_1['Name'] = df_bon['ID_Num'].str[:3]

    df_2.rename(columns={0:'ID_Num'}, inplace = True)
    df_2 = df_2.groupby(["ID_Num"]).size().reset_index(name='Count')
    df_2['Name'] = df_2['ID_Num'].str[:3]


    df_3.rename(columns={0:'ID_Num'}, inplace = True)
    df_3 = df_3.groupby(["ID_Num"]).size().reset_index(name='Count')
    df_3['Name'] = df_3['ID_Num'].str[:3]
    
    df_final = df_1.append([df_2, df_3],ignore_index=True)
    
 
    df_final.to_excel(excel, sheet_name="New Data")
 

Комментарии:

1. df_final.dropna() ? Он удалит строки, содержащие любые значения null (NaN).

2. перепишите свой внутренний код копирования-вставки во второй цикл for. затем используйте if-else, чтобы либо добавить df, либо пропустить.

3. проверьте, используя sheet_name=Нет. Он прочитает все существующие листы и поместит кадры данных в список. Вы должны иметь возможность объединить их и не беспокоиться о пропущенных листах pandas.pydata.org/pandas-docs/stable/reference/api/…

4. не могу отредактировать свой первоначальный ответ. ответ представляет собой словарь dfs. вы можете сделать это pd.concat(df.values()).reset_index() и изменить имя и группировку в конечном кадре данных. если вы не можете сделать это в final df, вы выполняете цикл по значениям (), а затем объединяете.