Pandas:读取包含合并单元格的Excel文件

62

我有一些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,传入天数列表,然后将索引设置为该列。但似乎应该有更简单的方法。)

3个回答

80
你可以使用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]

1
"ffill" 正是我正在寻找的。谢谢。 - iayork
1
如果要解决合并列而不是行的相同问题,您会如何解决? - Samarth Bharadwaj
9
fillna方法有一个axis参数,用于控制填充的方向。若要逐行填充DataFrame中所有NaN值,您可以使用df = df.fillna(method='ffill', axis=1)。若只想填充特定行,请使用df.loc或者df.iloc。例如,df.loc[mask] = df.loc[mask].fillna(method='ffill', axis=1) - unutbu
@unutbu 谢谢,但我的问题略有不同,表述在这里:https://dev59.com/X14c5IYBdhLWcg3w59qQ - Samarth Bharadwaj
也适用于问题列不是索引的情况。 - wander95
12
使用 ffill 进行 fillna 是可以的,只要合并单元格后不是紧跟着一个故意留空的单元格就行。 - PlasmaBinturong

14
df = df.fillna(method='ffill', axis=0)  # resolved updating the missing row entries

2
仅提供代码的答案通常在 Stack Overflow 上不被赞同。为了避免被关闭为“低质量”,请添加一些解释性文本。 - Adrian Mole

13

如果你想在8年后轻松地回来,pandas.read_excel()可以为您内部解决这个问题,只需要使用index_col参数即可。

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

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


太棒了!在我的情况下,index_col=[0,1,2,3]。没错!! - Michael Tiemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接