我正在尝试将excel文件有条件地解析为Pandas数据帧。我有一组excel文件,每个文件的顶部都有一些行,这些行不是数据的一部分-基于用于创建报告的报告参数的一些标识数据。

我想将ExcelFile.parse()方法与skiprows=some_number一起使用,但是我不知道每个文件的some_number是多少。

我确实知道HeaderRow将以可能性列表中的一个成员开头。如何告诉Pandas从可能列表中包含some_string的行开始创建dataframe

或者,是否可以导入整个工作表,然后删除在我的可能性列表中包括some_string的行之前的行?

最佳答案

大多数时候,我会在熊猫中进行后处理,即在熊猫中诊断,删除行并更正dtypes。这样做的好处是更容易,但可以说它不那么优雅(我怀疑这样做也会更快!):

In [11]: df = pd.DataFrame([['blah', 1, 2], ['some_string', 3, 4], ['foo', 5, 6]])

In [12]: df
Out[12]:
             0  1  2
0         blah  1  2
1  some_string  3  4
2          foo  5  6

In [13]: df[0].isin(['some_string']).argmax()  # assuming it's found
Out[13]: 1


我可能实际上是用python编写的,因为它在矢量化方面可能几乎没有/没有好处(而且我发现它更具可读性):

def to_skip(df, preceding):
    for s in enumerate(df[0]):
        if s in preceding:
            return i
    raise ValueError("No preceding string found in first column")

In [21]: preceding = ['some_string']

In [22]: to_skip(df, preceding)
Out[22]: 1

In [23]: df.iloc[1:]  # or whatever you need to do
Out[23]:
             0  1  2
1  some_string  3  4
2          foo  5  6




另一种可能性是,搞砸ExcelFile并找到行号(再次使用上述for循环,但使用openpyxl或类似方法)。但是,如果您这样做,我认为不会有一种方法可以只读取一次excel文件(xml)。

与您可以在CSV上执行此操作的方式相比,这有点不幸,您可以在其中读取前几行(直到看到所需的行/条目),然后将打开的文件传递给read_csv。 (如果您可以将Excel电子表格导出到csv,然后以熊猫解析,那将更快/更清洁...)

注意:read_excel并不是真的那么快(尤其是与read_csv相比)...因此,IMO您想尽快去看熊猫。

关于python - Pandas 高级read_excel或ExcelFile.parse,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29615788/

10-12 16:38