Pandas 高级 read_excel 或 ExcelFile.parse
Pandas advanced read_excel or ExcelFile.parse
我正在尝试将 excel 文件有条件地解析为 Pandas 数据帧。我有一组 excel 文件,每个文件的顶部都有一些不属于数据的行——一些基于用于创建报告的报告参数的标识数据。
我想对 skiprows=some_number
使用 ExcelFile.parse()
方法,但我不知道每个文件的 some_number 是什么。
我知道 HeaderRow
将从可能性列表中的一个成员开始。我如何告诉 Pandas
从我的可能性列表中包含任何 some_string 的行开始创建 dataframe
?
或者,有没有办法导入整个 sheet,然后删除我的可能性列表中包含任何 some_string 的行之前的行?
大多数时候我只是post-在pandas中处理这个,即在pandas中诊断、删除行并更正数据类型。这样做的好处是更容易 但 可以说不太优雅(我怀疑这样做也会 更快 !):
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 中写这个,因为它可能 little/no 有利于矢量化(而且我发现它更具可读性):
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
另一种可能性,弄乱 Excel 文件并找到行号可能正在做(再次使用如上所述的 for 循环,但在 openpyxl 或类似文件中)。但是,我 认为 如果您这样做,将不会有一种方法只读取 excel 文件 (xml) 一次。
与在 csv 上执行此操作的方式相比,这有点不幸,您可以在 csv 上阅读前几行(直到看到您想要的 row/entry),然后将此 打开 文件到read_csv
。 (如果您可以将 Excel 电子表格导出为 csv,然后在 pandas 中进行解析,那就是 faster/cleaner...)
注意:read_excel
并不是真的那么快(特别是与 read_csv
相比)...所以我想你想到达 pandas尽快.
我正在尝试将 excel 文件有条件地解析为 Pandas 数据帧。我有一组 excel 文件,每个文件的顶部都有一些不属于数据的行——一些基于用于创建报告的报告参数的标识数据。
我想对 skiprows=some_number
使用 ExcelFile.parse()
方法,但我不知道每个文件的 some_number 是什么。
我知道 HeaderRow
将从可能性列表中的一个成员开始。我如何告诉 Pandas
从我的可能性列表中包含任何 some_string 的行开始创建 dataframe
?
或者,有没有办法导入整个 sheet,然后删除我的可能性列表中包含任何 some_string 的行之前的行?
大多数时候我只是post-在pandas中处理这个,即在pandas中诊断、删除行并更正数据类型。这样做的好处是更容易 但 可以说不太优雅(我怀疑这样做也会 更快 !):
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 中写这个,因为它可能 little/no 有利于矢量化(而且我发现它更具可读性):
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
另一种可能性,弄乱 Excel 文件并找到行号可能正在做(再次使用如上所述的 for 循环,但在 openpyxl 或类似文件中)。但是,我 认为 如果您这样做,将不会有一种方法只读取 excel 文件 (xml) 一次。
与在 csv 上执行此操作的方式相比,这有点不幸,您可以在 csv 上阅读前几行(直到看到您想要的 row/entry),然后将此 打开 文件到read_csv
。 (如果您可以将 Excel 电子表格导出为 csv,然后在 pandas 中进行解析,那就是 faster/cleaner...)
注意:read_excel
并不是真的那么快(特别是与 read_csv
相比)...所以我想你想到达 pandas尽快.