Joining 3 separate DataFrames based off 3 common column values in Pandas - python

Working with an NFL dataset with pandas containing all offensive player stats for week 1 of the 2019 season. I currently have three DataFrames, one for passing stats, rushing stats, and receiving stats. I want to combine all three DataFrames into one final DataFrame. The problem is that some players appear in one or more DataFrames. For example, a QB can run and pass the ball, so some QB's appear in both the passing DF and the rushing DF. "Player" is the common index I want to combine them on, but each duplicated row will also have in common the 'Pos' and 'Tm' value. So I want to combine these three DataFrames on the columns 'Player', 'Tm' and 'Pos'.
I currently have each DataFrame saved to a variable in a list named dfs.
I tried
df = dfs[0].join(dfs[1:])
but that results in giving me a DataFrame with one row - Julian Edelman - the only player who ran, passed, and caught the ball in week 1 of the 2019 season. Suffice to say that's not what I'm looking for.
Copied below is the first five rows of each of the DataFrames.
Pos Tm PassingYds PassingTD Int PassingAtt Cmp
Player
Lamar Jackson QB BAL 324 5 0 20 17
Dak Prescott QB DAL 405 4 0 32 25
Robert Griffin QB BAL 55 1 0 6 6
Patrick Mahomes QB KAN 378 3 0 33 25
Kirk Cousins QB MIN 98 1 0 10 8
--------------------------------------------------------------------------
Pos Tm Rec Tgt ReceivingYds ReceivingTD
Player
Sammy Watkins WR KAN 9 11 198 3
Michael Gallup WR DAL 7 7 158 0
John Ross WR CIN 7 12 158 2
DeSean Jackson WR PHI 8 9 154 2
Marquise Brown WR BAL 4 5 147 2
---------------------------------------------------------------------------
Pos Tm RushingAtt RushingYds RushingTD
Player
Marlon Mack RB IND 25 174 1
Christian McCaffrey RB CAR 19 128 2
Saquon Barkley RB NYG 11 120 0
Dalvin Cook RB MIN 21 111 2
Mark Ingram RB BAL 14 107 2

You're looking for an outer join with Player, Pos and Tm as an index. First, append these to your index, then call your current attempt with a join type of outer
dfs = [d.set_index(['Pos', 'Tm'], append=True) for d in dfs]
dfs[0].join(dfs[1:], how='outer')
PassingYds PassingTD Int PassingAtt Cmp Rec Tgt ReceivingYds ReceivingTD RushingAtt RushingYds RushingTD
Player Pos Tm
Christian McCaffrey RB CAR NaN NaN NaN NaN NaN NaN NaN NaN NaN 19.0 128.0 2.0
Dak Prescott QB DAL 405.0 4.0 0.0 32.0 25.0 NaN NaN NaN NaN NaN NaN NaN
Dalvin Cook RB MIN NaN NaN NaN NaN NaN NaN NaN NaN NaN 21.0 111.0 2.0
DeSean Jackson WR PHI NaN NaN NaN NaN NaN 8.0 9.0 154.0 2.0 NaN NaN NaN
John Ross WR CIN NaN NaN NaN NaN NaN 7.0 12.0 158.0 2.0 NaN NaN NaN
Kirk Cousins QB MIN 98.0 1.0 0.0 10.0 8.0 NaN NaN NaN NaN NaN NaN NaN
Lamar Jackson QB BAL 324.0 5.0 0.0 20.0 17.0 NaN NaN NaN NaN NaN NaN NaN
Mark Ingram RB BAL NaN NaN NaN NaN NaN NaN NaN NaN NaN 14.0 107.0 2.0
Marlon Mack RB IND NaN NaN NaN NaN NaN NaN NaN NaN NaN 25.0 174.0 1.0
Marquise Brown WR BAL NaN NaN NaN NaN NaN 4.0 5.0 147.0 2.0 NaN NaN NaN
Michael Gallup WR DAL NaN NaN NaN NaN NaN 7.0 7.0 158.0 0.0 NaN NaN NaN
Patrick Mahomes QB KAN 378.0 3.0 0.0 33.0 25.0 NaN NaN NaN NaN NaN NaN NaN
Robert Griffin QB BAL 55.0 1.0 0.0 6.0 6.0 NaN NaN NaN NaN NaN NaN NaN
Sammy Watkins WR KAN NaN NaN NaN NaN NaN 9.0 11.0 198.0 3.0 NaN NaN NaN
Saquon Barkley RB NYG NaN NaN NaN NaN NaN NaN NaN NaN NaN 11.0 120.0 0.0

It's better to convert these following data in .CSV format and then merge the data and later you can import in form of dataframe.

Related

Sort multiIndex dataframe given the sum

Hello I have prepared a MultiIndex table in Pandas that looks like this:
Lang C++ java python All
Corp Name
ASW ASW 0.0 7.0 8.0 15
Cristiano NaN NaN 8.0 8
Michael NaN 7.0 0 7
Facebook Facebook 8.0 1.0 5.0 14
Piter 8.0 NaN NaN 8
Cristiano NaN NaN 3.0 3
Michael NaN 1.0 2.0 3
Google Google 2.0 24.0 1.0 27
Michael NaN 24.0 NaN 24
Piter 2.0 NaN NaN 2
Cristiano NaN NaN 1.0 1
Now I would like to Sort group of rows where sum of Corp(in column "All') is sorted decsending, then I would like to select only the two index "Corp"(and their rows) which are the largest,
It should looks like:
Lang C++ java python All
Corp Name
Google Google 2.0 24.0 1.0 27
Michael NaN 24.0 NaN 24
Piter 2.0 NaN NaN 2
Cristiano NaN NaN 1.0 1
ASW ASW 0.0 7.0 8.0 15
Cristiano NaN NaN 8.0 8
Michael NaN 7.0 0 7
Thank You!
IIUC, you can sort_values per group, then slice using the max sum of All per group:
out = (df
# for each company, sort the values using the All column in descending order
.groupby(level=0).apply(lambda g: g.sort_values('All', ascending=False))
# calculate the sum or All per company
# get the index of the top 2 companies (nlargest(2))
# slice to keep only those
.loc[lambda d: d.groupby(level=0)['All'].sum().nlargest(2).index]
)
output:
Lang C++ java python All
Corp Name
Google Google 2.0 24.0 1.0 27
Michael NaN 24.0 NaN 24
Piter 2.0 NaN NaN 2
Cristiano NaN NaN 1.0 1
Facebook Facebook 8.0 1.0 5.0 14
Piter 8.0 NaN NaN 8
Cristiano NaN NaN 3.0 3
Michael NaN 1.0 2.0 3

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)

Pandas divide returns dataframe with all NaNs

I have 2 Pandas Dataframes, totals and medal_counts. The head info is given below.
print(medal_counts.head())
NOC AFG AHO ALG ANZ ARG ARM AUS AUT AZE BAH ... URS URU \
Edition ...
1896 NaN NaN NaN NaN NaN NaN 2.0 5.0 NaN NaN ... NaN NaN
1900 NaN NaN NaN NaN NaN NaN 5.0 6.0 NaN NaN ... NaN NaN
1904 NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN ... NaN NaN
1908 NaN NaN NaN 19.0 NaN NaN NaN 1.0 NaN NaN ... NaN NaN
1912 NaN NaN NaN 10.0 NaN NaN NaN 14.0 NaN NaN ... NaN NaN
NOC USA UZB VEN VIE YUG ZAM ZIM ZZX
Edition
1896 20.0 NaN NaN NaN NaN NaN NaN 6.0
1900 55.0 NaN NaN NaN NaN NaN NaN 34.0
1904 394.0 NaN NaN NaN NaN NaN NaN 8.0
1908 63.0 NaN NaN NaN NaN NaN NaN NaN
1912 101.0 NaN NaN NaN NaN NaN NaN NaN
[5 rows x 138 columns]
print(totals.head())
Edition
1896 151
1900 512
1904 470
1908 804
1912 885
Name: Grand Total, dtype: int64
When I try divide 'medal_counts' using 'totals' row-wise using divide method, why I am getting all NaNs though there are some clear values in medal_counts, such as in 1896 for AUS, AUT, USA & ZZX.
fractions = medal_counts.divide(totals, axis='rows')
print(fractions.head())
NOC AFG AHO ALG ANZ ARG ARM AUS AUT AZE BAH ... URS URU USA \
Edition ...
1896 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
1900 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
1904 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
1908 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
1912 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
NOC UZB VEN VIE YUG ZAM ZIM ZZX
Edition
1896 NaN NaN NaN NaN NaN NaN NaN
1900 NaN NaN NaN NaN NaN NaN NaN
1904 NaN NaN NaN NaN NaN NaN NaN
1908 NaN NaN NaN NaN NaN NaN NaN
1912 NaN NaN NaN NaN NaN NaN NaN
Appreciate clarifications.
Below transformation works.
totals = totals.values
fractions = medal_counts.divide(totals, axis='rows')
When you use pandas divide:
df.divide(other)
The type of other can be : scalar, sequence, Series, or DataFrame.
In your case, if you would specify a series it would work:
fractions = medal_counts.divide(totals['Edition'], axis='rows')
So, when should we use dataframe?
If you the other dataframe`s shape is the same as df.
For example:
df = pd.DataFrame({'angles': [0, 3, 4],
'degrees': [360, 180, 360]},
index=['circle', 'triangle', 'rectangle'])
df
angles degrees
circle 0 360
triangle 3 180
rectangle 4 360
you can do:
>>> df.divide(df+1, axis='index')
angles degrees
circle 0.00 0.997230
triangle 0.75 0.994475
rectangle 0.80 0.997230
Why converting to numpy array is not safe?
If your rows are shuffled you will get the wrong answer:
df
angles degrees
circle 0 360
triangle 3 180
rectangle 4 360
shuffle the angles column and create a new df:
df2 = df[['angles']].sample(frac=1)
df2
angles
triangle 3
circle 0
rectangle 4
The desired output:
>>> df.divide(df2['angles'], axis='rows')
angles degrees
circle NaN inf
rectangle 1.0 90.0
triangle 1.0 60.0
and the output using numpy array:
>>> df.divide(df2['angles'].values, axis='rows')
angles degrees
circle 0.0 120.0
triangle inf inf
rectangle 1.0 90.0

Export a list of tables separately using Pandas

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.

Pandas long to wide with values filled based on answer

I am trying to convert a dataframe from long to wide, but Im not sure how to convert it to the format below. What am I missing?
d = {'vote': [100, 50,1,23,55,67,89,44],
'vote2': [10, 2,18,26,77,99,9,40],
'ballot1': ['a','b','a','a','b','a','a','b'],
'voteId':[1,2,3,4,5,6,7,8]}
df1=pd.DataFrame(d)
#########################################################
dftemp=df1
#####FORMATTING DATA
dftemp=pd.DataFrame(dftemp.reset_index())
dflw= dftemp.set_index(['voteId','vote','ballot1'])
dflw=dflw.unstack()
dflw.columns = dflw.columns.droplevel(0).rename('')
dflw=pd.DataFrame(dflw)
print(dflw)
MY CURRENT OUTPUT:
a b a b
voteId vote
1 100 0.0 NaN 10.0 NaN
2 50 NaN 1.0 NaN 2.0
GOAL:
voteid (ballot1=a)vote (ballot1=b)vote (ballot1=a)vote2 (ballot1=b)vote2
1 100 NaN 10 NaN
2 NaN 50 NaN 2
I am starting from df1
s=df1.set_index(['voteId','ballot1']).unstack()
s.columns=s.columns.map('(ballot1={0[1]}){0[0]}'.format)
s
Out[1120]:
(ballot1=a)vote (ballot1=b)vote (ballot1=a)vote2 (ballot1=b)vote2
voteId
1 100.0 NaN 10.0 NaN
2 NaN 50.0 NaN 2.0
3 1.0 NaN 18.0 NaN
4 23.0 NaN 26.0 NaN
5 NaN 55.0 NaN 77.0
6 67.0 NaN 99.0 NaN
7 89.0 NaN 9.0 NaN
8 NaN 44.0 NaN 40.0

Categories

Resources