Export a list of tables separately using Pandas - python

I am trying to extract all tables from a text file like https://www.sec.gov/Archives/edgar/data/1961/0001264931-18-000031.txt. I want to iterate over each table and if it contains a certain string (income tax), I want to export it using pandas dataframes. However, I keep getting the error that I cannot export a list. I know I am overlooking something simple, but how does my code not export every table separately
for filename, text in tqdm(dìctionary.items()):
soup = BeautifulSoup(text, "lxml")
tables = soup.find_all('table')
for i, table in enumerate(tables):
if ('income tax' in str(table)) or ('Income tax' in str(table)):
df = pd.read_html(str(table))
nametxt = filename.strip('.txt')
name = nametxt.replace("/", "")
df.to_csv('mypath\\' + name + '_%s.csv' %i)
else:
pass
0% 0/6547 [00:00<?, ?it/s]
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-99-e7794eac8da6> in <module>()
7 nametxt = filename.strip('.txt')
8 name = nametxt.replace("/", "")
----> 9 df.to_csv('mypath\\' + name + '_%s.csv' %i)
10 else:
11 pass
AttributeError: 'list' object has no attribute 'to_csv'
df looks like this:
[ 0 1 2 \
0 Worlds Inc. NaN NaN
1 Statements of Cash Flows NaN NaN
2 Year Ended December 31, 2017 and 2016 NaN NaN
3 NaN NaN Audited
4 NaN NaN 12/31/17
5 Cash flows from operating activities: NaN NaN
6 Net gain/(loss) NaN $
7 Adjustments to reconcile net loss to net cash ... NaN NaN
8 Loss on settlement of convertible notes NaN NaN
9 Fair value of stock options issued NaN NaN
10 Fair value of warrants issued NaN NaN
11 Amortization of discount to note payable NaN NaN
12 Changes in fair value of derivative liabilities NaN NaN
13 Accounts payable and accrued expenses NaN NaN
14 Due from/to related party NaN NaN
15 Net cash (used in) operating activities: NaN NaN
16 NaN NaN NaN
17 NaN NaN NaN
18 Cash flows from financing activities NaN NaN
19 Proceeds from issuance of note payable NaN NaN
20 Proceeds from issuance of convertible note pay... NaN NaN
21 Cash paid to repurchase convertible note payable NaN NaN
22 Proceeds from issuance of common stock NaN NaN
23 Proceeds from exercise of warrants NaN NaN
24 Issuance of common stock as payment for accoun... NaN NaN
25 Net cash provided by financing activities NaN NaN
26 NaN NaN NaN
27 Net increase/(decrease) in cash and cash equiv... NaN NaN
28 NaN NaN NaN
29 Cash and cash equivalents, including restricte... NaN NaN
30 NaN NaN NaN
31 Cash and cash equivalents, including restricte... NaN $
32 NaN NaN NaN
33 Non-cash financing activities NaN NaN
34 Issuance of 54,963,098 shares of common stock ... NaN NaN
35 NaN NaN NaN
36 Supplemental disclosure of cash flow information: NaN NaN
37 Cash paid during the year for: NaN NaN
38 Interest NaN $
39 Income taxes NaN $
40 NaN NaN NaN
41 The accompanying notes are an integral part of... NaN NaN
3 4 5 6 7 8
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN
3 NaN Audited NaN NaN NaN NaN
4 NaN 12/31/16 NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN
6 (2,746,968 ) NaN $ (1,132,906 )
7 NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN 246413 NaN
9 1041264 NaN NaN NaN — NaN
10 1215240 NaN NaN NaN — NaN
11 — NaN NaN NaN 5000 NaN
12 — NaN NaN NaN (6,191 )
13 267983 NaN NaN NaN 237577 NaN
14 (21,051 ) NaN NaN (31,257 )
15 (243,532 ) NaN NaN (681,364 )
16 NaN NaN NaN NaN NaN NaN
17 NaN NaN NaN NaN NaN NaN
18 NaN NaN NaN NaN NaN NaN
19 — NaN NaN NaN 290000 NaN
20 — NaN NaN NaN 156500 NaN
21 NaN NaN NaN NaN (175,257 )
22 NaN NaN NaN NaN 350000 NaN
23 292800 NaN NaN NaN 127200 NaN
24 25582 NaN NaN NaN — NaN
25 318382 NaN NaN NaN 748443 NaN
26 NaN NaN NaN NaN NaN NaN
27 74849 NaN NaN NaN 67079 NaN
28 NaN NaN NaN NaN NaN NaN
29 93378 NaN NaN NaN 26298 NaN
30 NaN NaN NaN NaN NaN NaN
31 168229 NaN NaN $ 93379 NaN
32 NaN NaN NaN NaN NaN NaN
33 NaN NaN NaN NaN NaN NaN
34 — NaN NaN NaN 384159 NaN
35 NaN NaN NaN NaN NaN NaN
36 NaN NaN NaN NaN NaN NaN
37 NaN NaN NaN NaN NaN NaN
38 — NaN NaN $ (34,916 )
39 — NaN NaN $ — NaN
40 NaN NaN NaN NaN NaN NaN
41 NaN NaN NaN NaN NaN NaN ]

Here is a similar question with solution Get HTML table into pandas Dataframe, not list of dataframe objects
Essentially, pd.read_html returns a list of dataframes and you need to select one to call to_csv.

Related

Max consecutive NaN's and filling them with values

I want to get the number of consecutive NaN's in each column and if the maximum of these consecutive NaN's are smaller than, let's say 3, then I want to fill those with the first prior non-NaN value, and if it's more than 3, then remove the whole column. Here's a small part of my dataset to work with.
>>> df
113550 100285 112283 101668 114157 100019
0 NaN 27.60000 NaN NaN NaN NaN
1 NaN 27.50000 NaN NaN 36.25000 NaN
2 NaN 27.25000 NaN NaN 36.25000 22.5
3 NaN 27.90000 NaN NaN 47.33333 22.5
4 NaN 28.00000 NaN NaN NaN NaN
5 NaN 27.66667 NaN NaN 36.25000 NaN
6 NaN 26.41667 NaN NaN 40.00000 NaN
7 NaN NaN NaN NaN 36.25000 NaN
8 NaN 27.87500 NaN NaN 41.87500 22.5
9 NaN 27.85000 NaN NaN 46.66667 22.5
10 NaN 27.45000 NaN NaN 40.00000 22.5
11 NaN 27.45000 NaN NaN 41.75000 NaN
12 NaN 26.43750 NaN NaN 40.00000 NaN
13 NaN 26.50000 NaN NaN 41.75000 NaN
14 NaN 26.60000 NaN NaN 41.75000 22.5
15 NaN 26.60000 NaN NaN 41.75000 22.5
16 NaN 24.62500 NaN NaN 39.83333 NaN
17 NaN 24.60000 NaN NaN 41.75000 NaN
18 NaN 24.50000 NaN NaN NaN 22.5
19 NaN 23.62500 NaN NaN 41.87500 NaN
From Identifying consecutive NaNs with Pandas, you can use:
consecutive_nans = lambda x: x.isna().groupby(x.notna().cumsum()).sum().max()
out = df[df.apply(consecutive_nans).loc[lambda x: x <= 3].index].ffill().bfill()
print(out)
# Output
100285 114157
0 27.60000 36.25000
1 27.50000 36.25000
2 27.25000 36.25000
3 27.90000 47.33333
4 28.00000 47.33333
5 27.66667 36.25000
6 26.41667 40.00000
7 26.41667 36.25000
8 27.87500 41.87500
9 27.85000 46.66667
10 27.45000 40.00000
11 27.45000 41.75000
12 26.43750 40.00000
13 26.50000 41.75000
14 26.60000 41.75000
15 26.60000 41.75000
16 24.62500 39.83333
17 24.60000 41.75000
18 24.50000 41.75000
19 23.62500 41.87500

extract specific information from unstructured table. How can I fix this error and structure my data and get my desired table?

I've converted my pdf file to excel and now I got table like this
I would like to extract the information from the table, like "name", "Exam ID", "ID", "Test Address", "theory test time" and "Skill test time". And write these information to a new excel file. Does anyone know how I do this with Python?
And I try the dataraframe by pandas
import pandas as pd
df = pd.read_excel (r’Copy of pdf-v1.xlsx')
print (df)
but the dataframe is very unstructured and "Exam ID" and people's name distributed in various places on the table. Like this
0 Exam ID
1 ID
2 Company
3 Job
4 subject of examination
5 Address
6 theory test time
7 Skill test address
8 Skill test time
9 NaN
10 NaN
11 P.S.: \n1. xxxx\n2. dfr\n3.\n
12 examination ...
13 name
14 Exam ID
15 ID
16 Company
17 Job
18 subject of examination
19 Address
20 theory test time
21 Skill test address
22 Skill test time
23 NaN
24 NaN
25 P.S.: \n1. xxxx\n2. dfr\n3.\n
26 examination ...
27 name
28 Exam ID
29 ID
30 Company
31 Job
32 subject of examination
33 Address
34 theory test time
35 Skill test address
36 Skill test time
37 NaN
38 NaN
39 P.S.: \n1. xxxx\n2. dfr\n3.\n
40 examination ...
41 name
42 Exam ID
43 ID
44 Company
45 Job
46 subject of examination
47 Address
48 theory test time
49 Skill test address
50 Skill test time
51 NaN
52 NaN
53 P.S.: \n1. xxxx\n2. dfr\n3.\n
Smith gender male Unnamed: 4 \
0 78610 NaN NaN NaN
1 108579352 NaN NaN NaN
2 NaN NaN NaN NaN
3 Police NaN Level Level Five
4 Theory, Skill NaN Degree high school
5 dffef NaN NaN NaN
6 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
7 cdwgrgtr NaN NaN NaN
8 2021-10-19 09:30 NaN NaN NaN
9 NaN NaN NaN NaN
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
12 NaN NaN NaN NaN
13 Charles gender male NaN
14 74308 NaN NaN NaN
15 733440627 NaN NaN NaN
16 NaN NaN NaN NaN
17 engeneer NaN Level Level Five
18 Theory, Skill NaN Degree Master
19 dffef NaN NaN NaN
20 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
21 cdwgrgtr NaN NaN NaN
22 2021-10-19 09:30 NaN NaN NaN
23 NaN NaN NaN NaN
24 NaN NaN NaN NaN
25 NaN NaN NaN NaN
26 NaN NaN NaN NaN
27 Gary gender male NaN
28 77564 NaN NaN NaN
29 392096759 NaN NaN NaN
30 NaN NaN NaN NaN
31 driver NaN Level Level Five
32 Theory, Skill NaN Degree High school
33 dffef NaN NaN NaN
34 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
35 cdwgrgtr NaN NaN NaN
36 2021-10-19 09:30 NaN NaN NaN
37 NaN NaN NaN NaN
38 NaN NaN NaN NaN
39 NaN NaN NaN NaN
40 NaN NaN NaN NaN
41 Whitney gender female NaN
42 78853 NaN NaN NaN
43 207628593 NaN NaN NaN
44 NaN NaN NaN NaN
45 data scientist NaN Level Level Five
46 Theory, Skill NaN Degree Master
47 dffef NaN NaN NaN
48 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
49 cdwgrgtr NaN NaN NaN
50 2021-10-19 09:30 NaN NaN NaN
51 NaN NaN NaN NaN
52 NaN NaN NaN NaN
53 NaN NaN NaN NaN
Unnamed: 5 Unnamed: 6 Unnamed: 7 name.1 \
0 NaN NaN NaN Exam ID
1 NaN NaN NaN ID
2 NaN NaN NaN Company
3 NaN NaN NaN Job
4 NaN NaN NaN subject of examination
5 NaN NaN NaN Address
6 NaN NaN NaN theory test time
7 NaN NaN NaN Skill test address
8 NaN NaN NaN Skill test time
9 NaN NaN NaN NaN
10 NaN NaN NaN NaN
11 NaN NaN NaN P.S.: \n1. xxxx\n2. dfr\n3.\n
12 NaN NaN NaN NaN
13 NaN NaN NaN name
14 NaN NaN NaN Exam ID
15 NaN NaN NaN ID
16 NaN NaN NaN Company
17 NaN NaN NaN Job
18 NaN NaN NaN subject of examination
19 NaN NaN NaN Address
20 NaN NaN NaN theory test time
21 NaN NaN NaN Skill test address
22 NaN NaN NaN Skill test time
23 NaN NaN NaN NaN
24 NaN NaN NaN NaN
25 NaN NaN NaN P.S.: \n1. xxxx\n2. dfr\n3.\n
26 NaN NaN NaN NaN
27 NaN NaN NaN name
28 NaN NaN NaN Exam ID
29 NaN NaN NaN ID
30 NaN NaN NaN Company
31 NaN NaN NaN Job
32 NaN NaN NaN subject of examination
33 NaN NaN NaN Address
34 NaN NaN NaN theory test time
35 NaN NaN NaN Skill test address
36 NaN NaN NaN Skill test time
37 NaN NaN NaN NaN
38 NaN NaN NaN NaN
39 NaN NaN NaN P.S.: \n1. xxxx\n2. dfr\n3.\n
40 NaN NaN NaN NaN
41 NaN NaN NaN name
42 NaN NaN NaN Exam ID
43 NaN NaN NaN ID
44 NaN NaN NaN Company
45 NaN NaN NaN Job
46 NaN NaN NaN subject of examination
47 NaN NaN NaN Address
48 NaN NaN NaN theory test time
49 NaN NaN NaN Skill test address
50 NaN NaN NaN Skill test time
51 NaN NaN NaN NaN
52 NaN NaN NaN NaN
53 NaN NaN NaN P.S.: \n1. xxxx\n2. dfr\n3.\n
Philip gender .1 male.1 Unnamed: 12
0 80425 NaN NaN NaN
1 121246038 NaN NaN NaN
2 NaN NaN NaN NaN
3 driver NaN Level Level Five
4 Theory, Skill NaN Degree Bachelor
5 dffef NaN NaN NaN
6 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
7 cdwgrgtr NaN NaN NaN
8 2021-10-19 09:30 NaN NaN NaN
9 NaN NaN NaN NaN
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
12 NaN NaN NaN NaN
13 Bill gender male NaN
14 74788 NaN NaN NaN
15 332094931 NaN NaN NaN
16 NaN NaN NaN NaN
17 driver NaN Level Level Five
18 Theory, Skill NaN Degree High school
19 dffef NaN NaN NaN
20 2021-10-18 10:00~2021-10-18 11:30 NaN NaN NaN
21 cdwgrgtr NaN NaN NaN
22 2021-10-19 09:30 NaN NaN NaN
23 NaN NaN NaN NaN
24 NaN NaN NaN NaN
25 NaN NaN NaN NaN
26 NaN NaN NaN NaN
27 Betty gender female NaN
28 61311 NaN NaN NaN
Also, I try to read the label and extract the next column cell to get desired results but the loop also gets error which the codes like:
for index, row in df.iterrows():
if row['A2'] == 'Exam Id':
exam_id=row['B2']
Then the python said key error:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
3360 try:
-> 3361 return self._engine.get_loc(casted_key)
3362 except KeyError as err:
~/opt/anaconda3/lib/python3.7/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
~/opt/anaconda3/lib/python3.7/site-packages/pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'A2'
The above exception was the direct cause of the following exception:
KeyError Traceback (most recent call last)
<ipython-input-36-03e11799668c> in <module>
1 for index, row in df.iterrows():
----> 2 if row['A2'] == 'Exam Id':
3 exam_id=row['B2']
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in __getitem__(self, key)
940
941 elif key_is_scalar:
--> 942 return self._get_value(key)
943
944 if is_hashable(key):
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/series.py in _get_value(self, label, takeable)
1049
1050 # Similar to Index.get_value, but we do not fall back to positional
-> 1051 loc = self.index.get_loc(label)
1052 return self.index._get_values_for_loc(self, loc, label)
1053
~/opt/anaconda3/lib/python3.7/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
3361 return self._engine.get_loc(casted_key)
3362 except KeyError as err:
-> 3363 raise KeyError(key) from err
3364
3365 if is_scalar(key) and isna(key) and not self.hasnans:
KeyError: 'A2'
How can I fix it?
The new excel table I want is :
Name
ID
Exam Id
Theory Test time
Address
Skill test Time
Skill test Address
Your best bet is probably to read the excel file yourself with openpyxl. You have to go through your lines (jumping 14 lines each time) and get the values in columns B and J. Then you make a Dataframe out of your Dictionary list:
from openpyxl import load_workbook
import pandas as pd
wb = load_workbook(filename = 'Copy of pdf-v1.xlsx.xlsx')
data_sheet = wb['Sheet1'] # enter the name of the Sheet
candidates = []
for i in range(1, data_sheet.max_row, 14):
candidate1 = dict()
candidate1['name'] = data_sheet[f'B{i}'].value
candidate1['ID'] = data_sheet[f'B{i+1}'].value
candidate1['Exam id'] = data_sheet[f'B{i+2}'].value
candidate1['Theory Test Time'] = data_sheet[f'B{i+7}'].value
candidate1['Address'] = data_sheet[f'B{i+6}'].value
candidate1['Skill Test Time'] = data_sheet[f'B{i+9}'].value
candidate1['Skill Test Address'] = data_sheet[f'B{i+8}'].value
candidates.append(candidate1)
candidate2 = dict()
candidate2['name'] = data_sheet[f'J{i}'].value
candidate2['ID'] = data_sheet[f'J{i+1}'].value
candidate2['Exam id'] = data_sheet[f'J{i+2}'].value
candidate2['Theory Test Time'] = data_sheet[f'J{i+7}'].value
candidate2['Address'] = data_sheet[f'J{i+6}'].value
candidate2['Skill Test Time'] = data_sheet[f'J{i+9}'].value
candidate2['Skill Test Address'] = data_sheet[f'J{i+8}'].value
candidates.append(candidate2)
table = pd.DataFrame(candidates)
print(table)

Copying a column from one pandas dataframe to another

I have the following code where i try to copy the EXPIRATION from the recent dataframe to the EXPIRATION column in the destination dataframe:
recent = pd.read_excel(r'Y:\Attachments' + '\\' + '962021.xlsx')
print('HERE\n',recent)
print('HERE2\n', recent['EXPIRATION'])
destination= pd.read_excel(r'Y:\Attachments' + '\\' + 'Book1.xlsx')
print('HERE3\n', destination)
destination['EXPIRATION']= recent['EXPIRATION']
print('HERE4\n', destination)
The problem is that destination has less rows than recent so some of the lower rows in the EXPIRATION column from recent do not end up in the destination dataframe. I want all the EXPIRATION values from recent to be in the destination dataframe, even if all the other values are NaN.
Example Output:
HERE
Unnamed: 0 IGNORE DATE_TRADE DIRECTION EXPIRATION NAME OPTION_TYPE PRICE QUANTITY STRATEGY STRIKE TIME_TRADE TYPE UNDERLYING
0 0 21 6/9/2021 B 08/06/2021 BNP FP E C 12 12 CONDORI 12 9:23:40 ETF NASDAQ
1 1 22 6/9/2021 B 16/06/2021 BNP FP E P 12 12 GOLD/SILVER 12 10:9:19 ETF NASDAQ
2 2 23 6/9/2021 B 16/06/2021 TEST P 12 12 CONDORI 21 10:32:12 EQT TEST
3 3 24 6/9/2021 B 22/06/2021 TEST P 12 12 GOLD/SILVER 12 10:35:5 EQT NASDAQ
4 4 0 6/9/2021 B 26/06/2021 TEST P 12 12 GOLD/SILVER 12 10:37:11 ETF FTSE100
HERE2
0 08/06/2021
1 16/06/2021
2 16/06/2021
3 22/06/2021
4 26/06/2021
Name: EXPIRATION, dtype: object
HERE3
Unnamed: 0 IGNORE DATE_TRADE DIRECTION EXPIRATION NAME OPTION_TYPE PRICE QUANTITY STRATEGY STRIKE TIME_TRADE TYPE UNDERLYING
0 NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN NaN NaN
HERE4
Unnamed: 0 IGNORE DATE_TRADE DIRECTION EXPIRATION NAME OPTION_TYPE PRICE QUANTITY STRATEGY STRIKE TIME_TRADE TYPE UNDERLYING
0 NaN NaN NaN NaN 08/06/2021 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN 16/06/2021 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN 16/06/2021 NaN NaN NaN NaN NaN NaN NaN NaN NaN
Joining is generally the best approach, but I see that you have no id column apart from native pandas indexing, and there are only Nans in destination, so if you are sure that ordering is not a problem you can just use:
>>> destination = pd.concat([recent,destination[['EXPIRATION']]], ignore_index=True, axis=1)
Unnamed: 0 IGNORE DATE_TRADE DIRECTION EXPIRATION ...
0 NaN NaN NaN NaN 08/06/2021 ...
1 NaN NaN NaN NaN 16/06/2021 ...
2 NaN NaN NaN NaN 16/06/2021 ...
3 NaN NaN NaN NaN 22/06/2021 ...
4 NaN NaN NaN NaN 26/06/2021 ...

Extract clear data in json from table in a pdf

I have the following PDF file from which I want to get the the data inside it so as i can integrate with my app.
Example i want to get 1 for Monday and 10 and 14 for the columns having white boxes
Here is what I have tried:
import tabula
df = tabula.read_pdf("IT.pdf",multiple_tables=True)
for col in df:
print(col)
The output comes like
07:00 08:00 08:00 09:00 Unnamed: 0 Unnamed: 1 ... Unnamed: 10 07:00 08:00.1 Unnamed: 11 08:00 09:00.1
0 Tutorial Tutorial NaN NaN ... NaN Tutorial NaN NaN
1 G1_MSU G1G2G3_M NaN NaN ... NaN SPU_07410 NaN NaN
2 07201 TU 07203 NaN NaN ... NaN 110 NaN NaN
3 110 110, 115, NaN NaN ... NaN Andaray, N NaN NaN
4 Lema, F (Mr) 117 NaN NaN ... NaN (Mr) NaN NaN
5 BscIRM__1 Farha, M NaN NaN ... NaN BIRM__2PT NaN NaN
6 C (Mrs), NaN NaN ... NaN NaN NaN NaN
7 NaN Mandia, A NaN NaN ... NaN NaN NaN NaN
8 NaN (Ms), NaN NaN ... NaN NaN NaN NaN
9 NaN Wilberth, N NaN NaN ... NaN NaN NaN NaN
10 NaN (Ms) NaN NaN ... NaN NaN NaN NaN
11 NaN BscIRM__1 NaN NaN ... NaN NaN NaN NaN
12 NaN C NaN NaN ... NaN NaN NaN NaN
13 Tutorial Tutorial NaN NaN ... NaN Tutorial NaN Tutorial
14 G4_MSU G3_MTU NaN NaN ... NaN AFT_05204 NaN BFT_05202
15 07201 07203 NaN NaN ... NaN 110 NaN 110
use camelot package. That will help you.

How to select a table based on its header from an Excel spreadsheet that contains multiple tables?

I am trying to interact with a spreadsheet and I have imported it using:
InitialImportedData = pd.read_excel(WorkbookLocation, SheetName)
The problem is that the spreadsheet I am importing from contains multiple tables, and I only want to use one of them. Is there a way to remove all the rows and columns before a specific value?
The table I am looking for has a header Premium. how do I get the table I want as a dataframe rather than all of them with loads of NaN's scattered in my frame?
Is there a way to locate a string in a dataframe and slice it based on that? It is the only one labelled Premium.
edit
I was able to find the location of the start of my table using:
I solved this in a different way, perhaps useful for people who want to slice up dataframes that they didn't read in through excel.
for x in range (InitialImportedData.shape[1]):
try :
list(InitialImportedData.iloc[:,x]).index('Premium')
print list(InitialImportedData.iloc[:,x]).index('Premium'),x
except:
pass
By converting to a list I was able to look where the value sat. I have not worked out how to slice my data correctly at the end.
I can use:
InitialImportedData.iloc[20:,4:]
to create a dataset which Starts in the corner I need (it happens to be at 20,4) but I have not found a way to slice the end of the table so it doesn't bring in extra information from the worksheet.
I have included an example dataset below:
Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 \
0 NaN Table 1 NaN NaN NaN
1 NaN Header1 Header2 NaN NaN
2 NaN 9.88496 2.29552 NaN NaN
3 NaN 7.36861 2.6275 NaN NaN
4 NaN 5.34938 8.37391 NaN NaN
5 NaN 8.77608 3.70626 NaN NaN
6 NaN 7.37828 2.62692 NaN NaN
7 NaN 6.82297 9.59347 NaN NaN
8 NaN 7.6804 7.38528 NaN NaN
9 NaN 2.07633 3.76247 NaN NaN
10 NaN NaN NaN NaN NaN
11 NaN NaN NaN NaN NaN
12 NaN NaN NaN NaN NaN
13 NaN NaN NaN NaN NaN
14 NaN NaN NaN NaN NaN
15 NaN NaN NaN NaN NaN
16 NaN NaN NaN NaN NaN
17 NaN NaN NaN NaN NaN
18 NaN NaN NaN NaN NaN
19 NaN NaN Premium NaN NaN
20 NaN NaN FinalHeader1 FinalHeader2 FinalHeader3
21 NaN NaN 0.679507 8.95 5.87512
22 NaN NaN 6.22637 6.54385 4.70131
23 NaN NaN 8.84881 6.74557 3.31503
24 NaN NaN 0.506901 5.36873 2.42905
25 NaN NaN 3.91448 0.542635 8.0885
26 NaN NaN 5.4045 9.08379 2.35789
27 NaN NaN 4.26343 1.37477 0.719881
28 NaN NaN 3.03682 9.62835 1.56601
Unnamed: 5 Unnamed: 6 Unnamed: 7 Unnamed: 8 Unnamed: 9
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN
6 NaN Table 2 NaN NaN NaN
7 NaN NewHeader1 NewHeader2 NewHeader3 NewHeader4
8 NaN 1.2035 2.13923 9.59979 4.90745
9 NaN 0.273928 9.84469 3.62225 1.07671
10 NaN 3.67524 9.82434 0.366233 7.9009
11 NaN 2.16405 2.66321 9.08495 8.29695
12 NaN 6.77611 7.90381 5.13672 3.26688
13 NaN 1.95482 1.95997 3.40453 0.702198
14 NaN 6.39919 5.24728 4.16757 6.06336
15 NaN 2.34901 9.35103 2.72374 7.39052
16 NaN NaN NaN NaN NaN
17 NaN NaN NaN NaN NaN
18 NaN NaN NaN NaN NaN
19 NaN NaN NaN NaN NaN
20 NaN NaN NaN NaN NaN
21 NaN NaN NaN NaN NaN
22 NaN NaN NaN NaN NaN
23 NaN NaN NaN NaN NaN
24 NaN NaN NaN NaN NaN
25 NaN NaN NaN NaN NaN
26 NaN NaN NaN NaN NaN
27 NaN NaN NaN NaN NaN
28 NaN NaN NaN NaN NaN
That is completely possible. Below is some of my own code that I have done this with. Combo1x is taking the heading "Name" in the sheet "Reference". Hope this helps!
filelog=pd.read_excel(desktop,read_only=True, sheetname=None, na_filter=False)
combo1= Combobox(frame3, state='readonly')
combo1x=list(filelog['Reference']['Name'])
EDIT: One way you could get all the numbers for just "Premium" would to be to take the max row and work backwards with a while statement.
ash=logbook["Approvals"]
rows = ash.max_row
mylist=[]
while rows != FinalHeader1
mylist.append()
rows -= 1
I ended up solving my problem by writing a function as follows:
# This function will search for a table within a dataframe, and cut out the section defined with the header specified
# this header must be in the top left, and their must be nothing below or to the right of the table
def CutOutTable(WhereWeAreSearching, WhatWeAreSearchingFor):
for x in range (WhereWeAreSearching.shape[1]):
try :
list(WhereWeAreSearching.iloc[:,x]).index(WhatWeAreSearchingFor)
WhereToCut = list(WhereWeAreSearching.iloc[:,x]).index(WhatWeAreSearchingFor),x
SlicedVersionOfWhereWeAreSearching = WhereWeAreSearching.iloc[WhereToCut[0]:,WhereToCut[1]:]
return SlicedVersionOfWhereWeAreSearching.dropna(axis = 1,how = 'all')
except:
pass
It looks for the position in the dataframe which contains the phrase you are looking for and cuts information above and to the left of that, followed by removing the columns which contains NaNs to the right of it, thus giving you your whole table. If and only if your table is the bottom rightmost item in your excel worksheet.

Categories

Resources