Как вставить заполнитель в агрегированный df при выполнении итерации по пустым электронным таблицам

#python

#python

Вопрос:

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

 df = pd.DataFrame({"A": [1, 2, 3], 
                   "B": [4, 5, 6],
                  "C": [7, 8, 9],
                  "D": [10, 11, 12],
                  "E": [13, 14, 15],
                  "F": [16, 17, 18],
                  "G": [19, 20, 21]})
  

Однако около 100 моих электронных таблиц представлены с тем же именем и количеством столбцов, что и мои заполненные электронные таблицы, однако данные отсутствуют. Они выглядят так:

 df2 = pd.DataFrame({"A": [], 
                   "B": [],
                  "C": [],
                  "D": [],
                  "E": [],
                  "F": [],
                  "G": []})
  

Я все еще хочу «извлечь» эту информацию и вставить заполнитель для этих пустых строк. Мой ожидаемый результат выглядит следующим образом:

 df3 = pd.DataFrame({"A": [1, 2, 3, NaN],
                   "B": [4, 5, 6, NaN],
                  "C": [7, 8, 9, NaN],
                  "D": [10, 11, 12, NaN],
                  "E": [13, 14, 15, NaN],
                  "F": [16, 17, 18, NaN],
                  "G": [19, 20, 21, NaN]})
  

В настоящее время мой код не заполняет агрегированную электронную таблицу моими заполнителями (NANS). Я пытался использовать df.fillna, а также добавлять NAN при проверке, был ли мой df пустым, однако я все еще не заполняю свой агрегированный df своими NAN из моих пустых электронных таблиц.
Вот что я написал до сих пор:

 import os
import pandas as pd
pd.options.display.max_rows=999
import numpy
from numpy import NaN

root = "my_dir"

agg_df = pd.DataFrame()

blank_rows = pd.Series([NaN,NaN,NaN,NaN,NaN,NaN,NaN], index=['A', 'B', 'C',
                                                'D', 'E', 
                                                'F', 'G'])

for directory, subdirectory, files in os.walk(root):
#     print(directory)
    for file in files:
        filepath = os.path.join(directory, file)
        print(directory)
        if file == 'Apples.xlsx':
            df_temp = pd.read_excel(filepath, sheet_name = 'Apples')
            df_temp['Filepath'] = filepath
            if df_temp.empty == True:
                df_temp.append(blank_rows, ignore_index = True)         
            agg_df = agg_df.append(df_temp)
  

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

1. Пожалуйста, поделитесь с нами образцами данных / файлов, которые вы используете, чтобы мы могли попробовать это сами. Спасибо.

2. Я обновил свой вопрос с моим ожидаемым результатом — надеюсь, это добавит ясности

Ответ №1:

Созданный вами blank_rows — это не одна строка, а семь строк. Итак, я создал одну строку без значений (NaN недопустимо). Затем, чтобы добавить пустую строку в agg_df, я использовал concat.

 root = ''
agg_df = pd.DataFrame()
blank_rows = pd.DataFrame(pd.Series([None,None,None,None,None,None,None], 
                                    index=['A', 'B', 'C',
                                                'D', 'E', 
                                                'F', 'G'])).transpose()
for directory, subdirectory, files in os.walk(root):
    for file in files:
        filepath = os.path.join(directory, file)
        df_temp = pd.read_excel(filepath, sheet_name = 'Apples')
        blank_rows['filepath'] = filepath
        if file == 'Apples.xlsx':
            if df_temp.empty == True:
                agg_df = pd.concat([agg_df, blank_rows])
  

Результат:

      A      B        C      D       E        F      G     filepath
0   None    None    None    None    None    None    None  my_dirApples.xlsx
  

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

1. Спасибо вам за это — куда бы я добавил имя файла, когда df_temp пуст? Мне все еще нужно отслеживать, какие файлы пусты.

2. Я отредактировал свой ответ. Вы можете добавить путь к файлу в blank_rows, поскольку это также фрейм данных.