Pandas проблема с ячейками при чтении из Excel - PullRequest
0 голосов
/ 11 марта 2020

Итак, у меня есть файл xls со странным стилем, но я ничего не могу с этим поделать, поэтому мне просто нужно разобрать его.

enter image description here

Как видите, у меня есть несколько объединенных клеток. Я хочу заполнить пустые значения для объединенных ячеек («ffill»), но также оставить пустые ячейки такими, какие они есть.

Примерно так

EIM, C,NI1 Enescu_Ioan, EIM, S,NI11,Enescu_Ioan EIM, C,NI1 Enescu_Ioan, Empty EIM, C,NI1 Enescu_Ioan EIM, S,NI11,Enescu_Ioan EIM, C,NI1,Enescu_Ioan Empty Способ, которым я загружаю файл прямо сейчас вот это.

xl = pd.ExcelFile("data/file.xls")
df = xl.parse(0, header=None)

Я тоже пытался открыть файл вот так и получить доступ к объединенным ячейкам, но я получаю пустой список.

book = xlrd.open_workbook("data/file.xls")
book.sheet_by_index(0).merged_cells # This is empty []

Есть ли способ, которым я мог бы достичь этого? Спасибо!

РЕДАКТИРОВАТЬ

В связи с вопросом могут возникнуть некоторые недоразумения, поэтому я постараюсь объяснить лучше. Прикрепленное изображение является подмножеством файла большего размера, в котором столбцы могут отображаться в другом порядке. Я пытаюсь добиться способа различения значений NAN объединенных ячеек (в объединенной ячейке значение имеет только первый столбец, все остальные - nan) и пустых ячеек NAN.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

удалось найти исправление

def read_excel(path):
    excel = None
    if path.endswith('xlsx'):
        excel = pd.ExcelFile(xlrd.open_workbook(path), engine='xlrd')
    elif path.endswith('xls'):
        excel = pd.ExcelFile(xlrd.open_workbook(path, formatting_info=True), engine='xlrd')
    else:
        raise ValueError("Could not read this type of data")
    return excel

def parse_excel(excel_file):
    sheet_0 = excel_file.book.sheet_by_index(0)
    df = excel_file.parse(0, header=None)
    return sheet_0, df

def fill_merged_na(sheet, dataframe):
    for e in sheet.merged_cells:
        rl, rh, cl, ch = e
        base_value = sheet.cell_value(rl, cl)
        dataframe.iloc[rl:rh, cl:ch] = base_value
    return dataframe

Некоторые важные биты открывают файл excel с параметром formatting_info, установленным в значение True, чтобы также считывать форматирование, такое как объединенные ячейки, и функцию fill_merged_na, которая заполняет только объединенные значения nan, но оставляют исходные пустые ячейки такими, какими они были.

0 голосов
/ 11 марта 2020

Вот так выглядит DataFrame, если вы делаете df = pd.read_excel('path')

print(df)

                     Col1                     Col2
0  EIM, C,NI1 Enescu_Ioan  EIM, S,NI11,Enescu_Ioan
1                     NaN                      NaN
2                     NaN  EIM, S,NI11,Enescu_Ioan
3                     NaN                      NaN

Теперь заполните значение из первой записи объединенной ячейки:

df['Col1'] = df['Col1'].fillna(method = 'ffill')

И используйте pandas.DataFrame.replace чтобы заменить NaN пробелами:

df['Col2'] = df['Col2'].replace(np.nan,'')

Пример:

df = pd.DataFrame({'Col1' : ['EIM, C,NI1 Enescu_Ioan',np.nan,np.nan,np.nan], 
                   'Col2' : ['EIM, S,NI11,Enescu_Ioan',np.nan,'EIM, S,NI11,Enescu_Ioan',np.nan]})

print(df)

                     Col1                     Col2
0  EIM, C,NI1 Enescu_Ioan  EIM, S,NI11,Enescu_Ioan
1                     NaN                      NaN
2                     NaN  EIM, S,NI11,Enescu_Ioan
3                     NaN                      NaN

df['Col1'] = df['Col1'].fillna(method = 'ffill')
df['Col2'] = df['Col2'].replace(np.nan,'')
print(df)
                     Col1                     Col2
0  EIM, C,NI1 Enescu_Ioan  EIM, S,NI11,Enescu_Ioan
1  EIM, C,NI1 Enescu_Ioan                         
2  EIM, C,NI1 Enescu_Ioan  EIM, S,NI11,Enescu_Ioan
3  EIM, C,NI1 Enescu_Ioan                         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...