从excel中读取时出现的单元格问题

2024-10-02 10:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个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的方法


Tags: 文件data风格nanxlsfileemptyxl
2条回答

设法找到了解决办法

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值,但保留初始空单元格不变

如果执行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                         

相关问题 更多 >

    热门问题