I have a pandas dataframe Date containing a column indicating a subject ID and several dates for each subject.
SubID date1 date2 .... daten
0 ID1 NaT NaN
1 ID2 2015-04-28 NaN
2 ID3 NaT NaN
The dates (date1, date2,....daten) contain NaT, NaN and dates in the form of yyyy-mm-dd.
I would like to count for each SubID how many "date" columns contain a real date.
in this small example I should have
SubID number of dates
0 ID1 0
1 ID2 1
2 ID3 0
I think you can use count with selecting columns by loc:
df['number of dates'] = df.loc[:,'date1':].count(axis=1)
Sample:
print (df)
SubID date1 date2
0 ID1 2015-04-28 2015-04-28
1 ID2 2015-04-28 NaT
2 ID3 NaT NaT
print (df.loc[:,'date1':])
date1 date2
0 2015-04-28 2015-04-28
1 2015-04-28 NaT
2 NaT NaT
df['number of dates'] = df.loc[:,'date1':].count(axis=1)
print (df)
SubID date1 date2 number of dates
0 ID1 2015-04-28 2015-04-28 2
1 ID2 2015-04-28 NaT 1
2 ID3 NaT NaT 0
Another solution with set_index and reset_index:
df = df.set_index('SubID')
df['number of dates'] = df.count(axis=1)
df = df.reset_index()
print (df)
SubID date1 date2 number of dates
0 ID1 2015-04-28 2015-04-28 2
1 ID2 2015-04-28 NaT 1
2 ID3 NaT NaT 0
df = pd.read_pickle('df')
df['number of dates'] = df.loc[:,'date1':].count(axis=1)
print (df)
SubID val_1_kalender_val1_a1 val_2_kalender_val1_a1_1 \
0 h2h_ht_ehv_p001_2 NaT NaN
1 h2h_ht_ehv_p002_3 2015-04-28 NaN
2 h2h_ht_ehv_p003_1 NaT NaN
3 h2h_ht_ehv_p004_4 NaT NaN
4 h2h_ht_ehv_p005_4 NaT NaN
5 h2h_ht_ehv_p006_1 NaT NaN
6 h2h_ht_ehv_p007_1 NaT NaN
7 h2h_ht_ehv_p008_3 2015-07-08 2015-08-06 00:00:00
8 h2h_ht_ehv_p009_3 2015-06-03 NaN
9 h2h_ht_ehv_p010_3 NaT NaN
10 h2h_ht_ehv_p011_3 NaT NaN
11 NaN NaT NaN
12 h2h_ht_ehv_p013_1 NaT NaN
13 h2h_ht_ehv_p014_3 NaT NaN
14 h2h_ht_ehv_p015_1 NaT NaN
15 h2h_ht_ehv_p016_1 NaT NaN
16 h2h_ht_ehv_p017_3 NaT NaN
17 h2h_ht_ehv_p018_1 2015-06-26 2015-08-10 00:00:00
18 h2h_ht_ehv_p019_1 2015-06-18 2015-07-16 00:00:00
19 h2h_ht_ehv_p020_3 NaT NaN
20 h2h_ht_ehv_p021_3 2015-08-09 NaN
21 h2h_ht_ehv_p022_3 2015-07-05 NaN
22 h2h_ht_ehv_p023_3 NaT NaN
23 h2h_ht_ehv_p024_3 NaT NaN
24 h2h_ht_ehv_p025_3 NaT NaN
25 h2h_ht_ehv_p026_3 2015-09-12 NaN
26 h2h_ht_ehv_p027_3 NaT NaN
27 h2h_ht_ehv_p028_3 NaT NaN
28 h2h_ht_ehv_p029_3 NaT NaN
29 h2h_ht_ehv_p030_3 NaT NaN
.. ... ... ...
99 h2h_ht_ehv_p100_3 NaT NaN
100 h2h_ht_ehv_p101_3 NaT NaN
101 h2h_ht_ehv_p102_3 NaT NaN
102 h2h_ht_ehv_p103_1 2016-06-14 NaN
103 h2h_ht_ehv_p104_3 NaT NaN
104 NaN 2016-02-12 NaN
105 h2h_ht_ehv_p106_3 NaT NaN
106 h2h_ht_ehv_p107_3 NaT NaN
107 h2h_ht_ehv_p108_3 NaT NaN
108 h2h_ht_ehv_p109_3 NaT NaN
109 h2h_ht_ehv_p110_1 NaT NaN
110 h2h_ht_ehv_p111_1 NaT NaN
111 h2h_ht_ehv_p112_3 NaT NaN
112 h2h_ht_ehv_p113_3 NaT NaN
113 h2h_ht_ehv_p114_3 2016-06-06 NaN
114 h2h_ht_ehv_p115_1 NaT NaN
115 h2h_ht_ehv_p116_3 2016-03-18 NaN
116 h2h_ht_ehv_p117_3 NaT NaN
117 h2h_ht_ehv_p118_3 NaT NaN
118 NaN NaT NaN
119 h2h_ht_ehv_p120_3 NaT NaN
120 h2h_ht_ehv_p121_3 NaT NaN
121 h2h_ht_ehv_p122_3 NaT NaN
122 h2h_ht_ehv_p123_3 2016-06-21 NaN
123 h2h_ht_ehv_p124_3 NaT NaN
124 h2h_ht_ehv_p125_3 2016-03-29 NaN
125 h2h_ht_ehv_p126_3 NaT NaN
126 h2h_ht_ehv_p127_1 NaT NaN
127 h2h_ht_ehv_p128_3 NaT NaN
128 h2h_ht_ehv_p129_3 NaT NaN
val_3_kalender_val1_a1_2 val_4_kalender_val1_a1_3 \
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
10 NaN NaN
11 NaN NaN
12 NaN NaN
13 NaN NaN
14 NaN NaN
15 NaN NaN
16 NaN NaN
17 NaN NaN
18 2015-07-17 00:00:00 2015-07-27 00:00:00
19 NaN NaN
20 NaN NaN
21 NaN NaN
22 NaN NaN
23 NaN NaN
24 NaN NaN
25 NaN NaN
26 NaN NaN
27 NaN NaN
28 NaN NaN
29 NaN NaN
.. ... ...
99 NaN NaN
100 NaN NaN
101 NaN NaN
102 NaN NaN
103 NaN NaN
104 NaN NaN
105 NaN NaN
106 NaN NaN
107 NaN NaN
108 NaN NaN
109 NaN NaN
110 NaN NaN
111 NaN NaN
112 NaN NaN
113 NaN NaN
114 NaN NaN
115 NaN NaN
116 NaN NaN
117 NaN NaN
118 NaN NaN
119 NaN NaN
120 NaN NaN
121 NaN NaN
122 NaN NaN
123 NaN NaN
124 NaN NaN
125 NaN NaN
126 NaN NaN
127 NaN NaN
128 NaN NaN
val_5_kalender_val1_a1_4 val_6_kalender_val1_a1_5 \
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
10 NaN NaN
11 NaN NaN
12 NaN NaN
13 NaN NaN
14 NaN NaN
15 NaN NaN
16 NaN NaN
17 NaN NaN
18 2015-09-06 00:00:00 2015-10-03 00:00:00
19 NaN NaN
20 NaN NaN
21 NaN NaN
22 NaN NaN
23 NaN NaN
24 NaN NaN
25 NaN NaN
26 NaN NaN
27 NaN NaN
28 NaN NaN
29 NaN NaN
.. ... ...
99 NaN NaN
100 NaN NaN
101 NaN NaN
102 NaN NaN
103 NaN NaN
104 NaN NaN
105 NaN NaN
106 NaN NaN
107 NaN NaN
108 NaN NaN
109 NaN NaN
110 NaN NaN
111 NaN NaN
112 NaN NaN
113 NaN NaN
114 NaN NaN
115 NaN NaN
116 NaN NaN
117 NaN NaN
118 NaN NaN
119 NaN NaN
120 NaN NaN
121 NaN NaN
122 NaN NaN
123 NaN NaN
124 NaN NaN
125 NaN NaN
126 NaN NaN
127 NaN NaN
128 NaN NaN
val_7_kalender_val1_a1_6 val_8_kalender_val1_a1_7 \
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 NaN NaN
10 NaN NaN
11 NaN NaN
12 NaN NaN
13 NaN NaN
14 NaN NaN
15 NaN NaN
16 NaN NaN
17 NaN NaN
18 NaN NaN
19 NaN NaN
20 NaN NaN
21 NaN NaN
22 NaN NaN
23 NaN NaN
24 NaN NaN
25 NaN NaN
26 NaN NaN
27 NaN NaN
28 NaN NaN
29 NaN NaN
.. ... ...
99 NaN NaN
100 NaN NaN
101 NaN NaN
102 NaN NaN
103 NaN NaN
104 NaN NaN
105 NaN NaN
106 NaN NaN
107 NaN NaN
108 NaN NaN
109 NaN NaN
110 NaN NaN
111 NaN NaN
112 NaN NaN
113 NaN NaN
114 NaN NaN
115 NaN NaN
116 NaN NaN
117 NaN NaN
118 NaN NaN
119 NaN NaN
120 NaN NaN
121 NaN NaN
122 NaN NaN
123 NaN NaN
124 NaN NaN
125 NaN NaN
126 NaN NaN
127 NaN NaN
128 NaN NaN
val_9_kalender_val1_a1_8 number of dates
0 NaN 0
1 NaN 1
2 NaN 0
3 NaN 0
4 NaN 0
5 NaN 0
6 NaN 0
7 NaN 2
8 NaN 1
9 NaN 0
10 NaN 0
11 NaN 0
12 NaN 0
13 NaN 0
14 NaN 0
15 NaN 0
16 NaN 0
17 NaN 2
18 NaN 6
19 NaN 0
20 NaN 1
21 NaN 1
22 NaN 0
23 NaN 0
24 NaN 0
25 NaN 1
26 NaN 0
27 NaN 0
28 NaN 0
29 NaN 0
.. ... ...
99 NaN 0
100 NaN 0
101 NaN 0
102 NaN 1
103 NaN 0
104 NaN 1
105 NaN 0
106 NaN 0
107 NaN 0
108 NaN 0
109 NaN 0
110 NaN 0
111 NaN 0
112 NaN 0
113 NaN 1
114 NaN 0
115 NaN 1
116 NaN 0
117 NaN 0
118 NaN 0
119 NaN 0
120 NaN 0
121 NaN 0
122 NaN 1
123 NaN 0
124 NaN 1
125 NaN 0
126 NaN 0
127 NaN 0
128 NaN 0
[129 rows x 11 columns]
Related
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
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)
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.
Hi I have the following dataframe:
>df1
code item01 item02 item03 item04 item05
0 1111 nan nan nan nan 440
1 1111 nan nan nan 650 nan
2 1111 nan nan nan nan nan
3 1111 nan nan nan nan nan
4 1111 32 nan nan nan nan
5 1111 nan nan nan nan nan
6 1111 nan nan nan nan nan
7 1111 nan nan nan nan nan
8 1111 nan nan nan nan nan
9 1111 nan nan nan nan nan
10 1111 nan nan nan nan nan
11 2222 20 nan nan nan nan
12 2222 nan nan nan nan nan
13 2222 nan nan nan 5 nan
14 2222 nan 7 nan nan nan
15 2222 nan nan nan nan nan
16 2222 nan nan nan nan nan
How can I merge using 'code' column within the dataframe to get df2 without for loop or iterrows().
>df2
code item01 item02 item03 item04 item05
0 1111 32 130 nan 650 440
1 2222 20 7 nan 5 nan
You can use:
If max one non value in column per group only:
df.groupby('code').first()
If possible multiple values - more general solution:
cols = df.columns.difference(['code'])
df = df.groupby('code')[cols]
.apply(lambda x: x.apply(lambda y: pd.Series(y.dropna().values)))
print (df)
item01 item02 item03 item04 item05
code
1111 0 32.0 NaN NaN 650.0 440.0
2222 0 20.0 7.0 NaN 5.0 NaN
You can simply use a groupby:
df1.groupby('code').max().reset_index(drop=True,inplace=True)
Be careful, if there are many values for an item with the same code, here you will keep the biggest one.
The reset_index is only used to get Output DataFrame in the same format.
I set up a new data frame SimMean:
columns = ['Tenor','5x16', '7x8', '2x16H']
index = range(0,12)
SimMean = pd.DataFrame(index=index, columns=columns)
SimMean
Tenor 5x16 7x8 2x16H
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN
6 NaN NaN NaN NaN
7 NaN NaN NaN NaN
8 NaN NaN NaN NaN
9 NaN NaN NaN NaN
10 NaN NaN NaN NaN
11 NaN NaN NaN NaN
I have another data frame FwdDf:
FwdDf
Tenor 5x16 7x8 2x16H
0 2017-01-01 50.94 34.36 43.64
1 2017-02-01 50.90 32.60 42.68
2 2017-03-01 42.66 26.26 37.26
3 2017-04-01 37.08 22.65 32.46
4 2017-05-01 42.21 20.94 33.28
5 2017-06-01 39.30 22.05 32.29
6 2017-07-01 50.90 21.80 38.51
7 2017-08-01 42.77 23.64 35.07
8 2017-09-01 37.45 19.61 32.68
9 2017-10-01 37.55 21.75 32.10
10 2017-11-01 35.61 22.73 32.90
11 2017-12-01 40.16 29.79 37.49
12 2018-01-01 53.45 36.09 47.61
13 2018-02-01 52.89 35.74 45.00
14 2018-03-01 44.67 27.79 38.62
15 2018-04-01 38.48 24.21 34.43
16 2018-05-01 43.87 22.17 34.69
17 2018-06-01 40.24 22.85 34.31
18 2018-07-01 49.98 23.58 39.96
19 2018-08-01 45.57 24.76 37.23
20 2018-09-01 38.90 21.74 34.22
21 2018-10-01 39.75 23.36 35.20
22 2018-11-01 38.04 24.20 34.62
23 2018-12-01 42.68 31.03 40.00
now I need to assign the 'Tenor' data from row 12 to row 23 in FwdDf to the new data frame SimMean.
I used
SimMean.loc[0:11,'Tenor'] = FwdDf.loc [12:23,'Tenor']
but it didn't work:
SimMean
Tenor 5x16 7x8 2x16H
0 None NaN NaN NaN
1 None NaN NaN NaN
2 None NaN NaN NaN
3 None NaN NaN NaN
4 None NaN NaN NaN
5 None NaN NaN NaN
6 None NaN NaN NaN
7 None NaN NaN NaN
8 None NaN NaN NaN
9 None NaN NaN NaN
10 None NaN NaN NaN
11 None NaN NaN NaN
I'm new to python. I would appreciate your help. Thanks
call .values so there are no index alignment issues:
In [35]:
SimMean.loc[0:11,'Tenor'] = FwdDf.loc[12:23,'Tenor'].values
SimMean
Out[35]:
Tenor 5x16 7x8 2x16H
0 2018-01-01 NaN NaN NaN
1 2018-02-01 NaN NaN NaN
2 2018-03-01 NaN NaN NaN
3 2018-04-01 NaN NaN NaN
4 2018-05-01 NaN NaN NaN
5 2018-06-01 NaN NaN NaN
6 2018-07-01 NaN NaN NaN
7 2018-08-01 NaN NaN NaN
8 2018-09-01 NaN NaN NaN
9 2018-10-01 NaN NaN NaN
10 2018-11-01 NaN NaN NaN
11 2018-12-01 NaN NaN NaN
EDIT
As your column is actually datetime then you need to convert the type again:
In [46]:
SimMean['Tenor'] = pd.to_datetime(SimMean['Tenor'])
SimMean
Out[46]:
Tenor 5x16 7x8 2x16H
0 2018-01-01 NaN NaN NaN
1 2018-02-01 NaN NaN NaN
2 2018-03-01 NaN NaN NaN
3 2018-04-01 NaN NaN NaN
4 2018-05-01 NaN NaN NaN
5 2018-06-01 NaN NaN NaN
6 2018-07-01 NaN NaN NaN
7 2018-08-01 NaN NaN NaN
8 2018-09-01 NaN NaN NaN
9 2018-10-01 NaN NaN NaN
10 2018-11-01 NaN NaN NaN
11 2018-12-01 NaN NaN NaN