Copying a column from one pandas dataframe to another - python

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 ...

Related

Grouping by year through months: pivot table

I need to group values by Year, from my dataset:
Date Freq Year Month
0 2020-03-19 32 2020 3
1 2020-03-25 31 2020 3
2 2020-03-23 28 2020 3
3 2020-03-04 26 2020 3
4 2020-08-04 26 2020 8
... ... ... ... ...
2516 2011-09-02 1 2011 9
2517 2013-04-25 1 2013 4
2518 2020-09-02 1 2020 9
2519 2013-09-03 1 2013 9
2520 2015-01-01 1 2015 1
The table below was found as follows:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
try_this=pd.pivot_table(df, values = 'Freq', index=['Date','Year'], columns = 'Month')
Month 1 2 3 4 5 6 7 8 9 10 11 12
Date Year
2010-03-04 2010 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2010-03-07 2010 NaN NaN 1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2010-07-31 2010 NaN NaN NaN NaN NaN NaN 1.0 NaN NaN NaN NaN NaN
2010-10-07 2010 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 NaN NaN
2010-12-20 2010 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2020-12-05 2020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 15.0
2020-12-06 2020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 10.0
2020-12-08 2020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 18.0
2020-12-09 2020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 4.0
2020-12-10 2020 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 14.0
I am trying to get something like this:
Year 1 2 3 4 5 6 7 8 9 10 11 12
2020 ... 61.0
2019 ...
2018 ...
...
i.e. a table where group by year the frequency through months.
What I tried (code above) is not giving me this output.
I would appreciated more help on how to figure it out.
References:
Plot through time setting specific filtering
How to pivot a dataframe in Pandas?
Have you tried using aggfunc in pivot_table:
df = df[['Year', 'Month', 'Freq']]
df = df.pivot_table(values=['Freq'], columns=['Month'], index=['Year'], aggfunc='sum')
print(df)
Freq
Month 1 3 4 8 9
Year
2011 NaN NaN NaN NaN 1.0
2013 NaN NaN 1.0 NaN 1.0
2015 1.0 NaN NaN NaN NaN
2020 NaN 117.0 NaN 26.0 1.0

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 convert rows in a list using pandas

Used code and file: https://github.com/CaioEuzebio/Python-DataScience-MachineLearning/tree/master/SalesLogistics
I am working on an analysis using pandas. Basically I need to sort the orders by quantity of products, and containing the same products.
Example: I have order 1 and order 2, both have product A and product B. Using the product list and product quantity as a key I will create a pivot that will index this combination of products and return me the order who own the same products.
The general objective of the analysis is to obtain a dataframe as follows:
dfFinal
listProds Ordens NumProds
[prod1,prod2,prod3] 1 3
2
3
[prod1,prod3,prod5] 7 3
15
25
[prod5] 8 1
3
So far the code looks like this.
Setting the 'Order' column as index so that the first pivot is made.
df1.index=df1['Ordem']
df3 = df1.assign(col=df1.groupby(level=0).Produto.cumcount()).pivot(columns='col', values='Produto')
With this pivot I get the dataframe below.
df3 =
col 0 1 2 3 4 5 6 7 8 9 ... 54 55 56 57 58 59 60 61 62 63
Ordem
10911KD YIZ12FF-A YIZ12FF-A YIIE2FF-A YIR72FF-A YIR72FF-A YIR72FF-A NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
124636 HYY32ZY-A HYY32ZY-A NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1719KD5 YI742FF-A YI742FF-A YI742FF-A YI742FF-A NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
22215KD YI762FF-A YI762FF-A YI762FF-A YI762FF-A YI762FF-A YI762FF-A YI6E2FF-A YI6E2FF-A YI6E2FF-A NaN ... NaN NaN NaN NaN NaN
When I finish running the code, NaN values ​​appear, and I need to remove them from the lines so that I don't influence the analysis I'm doing.

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.

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