我正在尝试将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/