【问题标题】:Pandas: Reading Excel with merged cellsPandas:使用合并单元格读取 Excel
【发布时间】:2014-05-21 04:27:03
【问题描述】:

我有包含多个工作表的 Excel 文件,每个工作表看起来都像这样(但要长得多):

        Sample  CD4     CD8
Day 1   8311    17.3    6.44
        8312    13.6    3.50
        8321    19.8    5.88
        8322    13.5    4.09
Day 2   8311    16.0    4.92
        8312    5.67    2.28
        8321    13.0    4.34
        8322    10.6    1.95

第一列实际上是四个垂直合并的单元格。

当我使用 pandas.read_excel 阅读本文时,我得到一个如下所示的 DataFrame:

       Sample    CD4   CD8
Day 1    8311  17.30  6.44
NaN      8312  13.60  3.50
NaN      8321  19.80  5.88
NaN      8322  13.50  4.09
Day 2    8311  16.00  4.92
NaN      8312   5.67  2.28
NaN      8321  13.00  4.34
NaN      8322  10.60  1.95

如何让 Pandas 理解合并的单元格,或者快速轻松地删除 NaN 并按适当的值分组? (一种方法是重置索引,逐步查找值并用值替换 NaN,传入天数列表,然后将索引设置为列。但似乎应该有一种更简单的方法。)

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    您可以使用 Series.fillna 方法来前填 NaN 值:

    df.index = pd.Series(df.index).fillna(method='ffill')
    

    例如,

    In [42]: df
    Out[42]: 
           Sample    CD4   CD8
    Day 1    8311  17.30  6.44
    NaN      8312  13.60  3.50
    NaN      8321  19.80  5.88
    NaN      8322  13.50  4.09
    Day 2    8311  16.00  4.92
    NaN      8312   5.67  2.28
    NaN      8321  13.00  4.34
    NaN      8322  10.60  1.95
    
    [8 rows x 3 columns]
    
    In [43]: df.index = pd.Series(df.index).fillna(method='ffill')
    
    In [44]: df
    Out[44]: 
           Sample    CD4   CD8
    Day 1    8311  17.30  6.44
    Day 1    8312  13.60  3.50
    Day 1    8321  19.80  5.88
    Day 1    8322  13.50  4.09
    Day 2    8311  16.00  4.92
    Day 2    8312   5.67  2.28
    Day 2    8321  13.00  4.34
    Day 2    8322  10.60  1.95
    
    [8 rows x 3 columns]
    

    【讨论】:

    • "ffill" 正是我想要的。谢谢。
    • 你将如何解决合并列而不是行的相同问题?
    • @SamarthBharadwaj:fillna method 有一个 axis 参数,用于控制要填充的方向。要按行填充 DataFrame 中的所有 NaN,您可以使用 df = df.fillna(method='ffill', axis=1)。要仅填充选定的行,请使用 df.locdf.iloc。例如,df.loc[mask] = df.loc[mask].fillna(method='ffill', axis=1)
    • @unutbu thx,但我的问题略有不同,在这里表达:*.com/questions/27420263/…
    • fillnaffill 是可以的,只要合并的单元格后面没有自愿为空的单元格...
    【解决方案2】:
    df = df.fillna(method='ffill', axis=0)  # resolved updating the missing row entries
    

    【讨论】:

    • 只有代码的答案在 Stack Overflow 上通常不受欢迎。为了避免被“低质量”关闭,请添加一些说明文字。
    【解决方案3】:

    8年后随便回来,pandas.read_excel()可以通过index_col参数在内部为你解决这个问题。

    df = pd.read_excel('path_to_file.xlsx', index_col=[0])
    

    将 index_col 作为列表传递将导致 pandas 查找 MultiIndex。在存在长度为 1 的列表的情况下,pandas 会创建一个常规索引来填充数据。

    【讨论】:

      最近更新 更多