使用python从电子表格中提取多个表

时间:2017-04-02 20:38:59

标签: python excel pandas

我想提取一系列excel电子表格的多个表格,其中某些表格可能包含多个表格,以便分别存储表格,例如csv文件。表格可能是这样的:

enter image description here

如果我使用pandas read_excel

阅读它
import pandas as pd
pd.read_excel('table_example.xlsx',header=None)

我会得到这样的东西:

enter image description here

我怎样才能提取不同的表格?在我的情况下,表具有NaN值,这可能是一个额外的复杂因素。

[EDIT1] 可以使用pandas生成类似于excel表的内容:

df=pd.DataFrame(np.nan,index=range(0,10),columns=range(0,10))
df.iloc[1,2:5]=['t1h1','t1h2','t1h3']
df.iloc[2:5,2:5]=np.random.randn(3,3)
df.iloc[6,3:7]=['t2h1','t2h2','t2h3','t2h4']
df.iloc[7:9,3:7]=np.random.randn(2,4)

我试图使用内置的pandas函数找到表的限制:

df[df.isnull().all(axis=1)]

我可以使用第一行和第二行设置水平分割并可能进行第一次分割,但我不知道如何选择标识行上方或下方的单元格。或者即使这是最方便的方法。

免责声明:在我的情况下,表格总是在标题上方的行中有一个标记,这是因为这些表格是由非python软件读取的,该软件使用它们来识别表格的起始位置。我决定不考虑这些标签来提出其他人可能会遇到的更普遍的问题。

2 个答案:

答案 0 :(得分:2)

import numpy as np
import pandas as pd

# I have assumed that the tables are "separated" by at least one row with only NaN values

df=pd.DataFrame(np.nan,index=range(0,10),columns=range(0,10))
df.iloc[1,2:5]=['t1h1','t1h2','t1h3']
df.iloc[2:5,2:5]=np.random.randn(3,3)
df.iloc[6,3:7]=['t2h1','t2h2','t2h3','t2h4']
df.iloc[7:9,3:7]=np.random.randn(2,4)

print(df)

# Extract by rows

nul_rows = list(df[df.isnull().all(axis=1)].index)

list_of_dataframes = []
for i in range(len(nul_rows) - 1):
    list_of_dataframes.append(df.iloc[nul_rows[i]+1:nul_rows[i+1],:])


# Remove null columns

cleaned_tables = []
for _df in list_of_dataframes:
    cleaned_tables.append(_df.dropna(axis=1, how='all'))

# cleaned_tables is a list of the dataframes

print(cleaned_tables[0])
print(cleaned_tables[1])

答案 1 :(得分:0)

只要2个表由NaN的行或列分隔,这可能有助于动态定位和提取表。

我使用了https://stackoverflow.com/a/54675526的边界框解决方案

function primes(limit)
{
  var prime=[], i=1;
  while (++i < limit+1) prime.reduce((a,c)=>(i%c)*a,1) && prime.push(i);
  prime.unshift(2);
  return prime;
}
[50].forEach(n=>document.getElementById('foreach').innerHTML=(`${primes(n)}`));
from skimage.measure import label, regionprops