Pandas: if Column A is blank, Column B else Column A - python

Current_df:
Unnamed: 0 Div Date Time HomeTeam AwayTeam FTHG FTAG FTR HTHG HTAG HTR Referee Unnamed: 62 GB>2.5 GB<2.5 GBAHH GBAHA GBAH HT AT
0 0 E0 2019-08-09 20:00:00 Liverpool Norwich 4 1 H 4 0 H M Oliver NaN NaN NaN NaN NaN NaN NaN NaN
1 1 E0 2019-08-10 12:30:00 West Ham Man City 0 5 A 0 1 A M Dean NaN NaN NaN NaN NaN NaN NaN NaN
2 2 E0 2019-08-10 15:00:00 Bournemouth Sheffield United 1 1 D 0 0 D K Friend NaN NaN NaN NaN NaN NaN NaN NaN
3 3 E0 2019-08-10 15:00:00 Burnley Southampton 3 0 H 0 0 D G Scott NaN NaN NaN NaN NaN NaN NaN NaN
4 4 E0 2019-08-10 15:00:00 Crystal Palace Everton 0 0 D 0 0 D J Moss NaN NaN NaN NaN NaN NaN NaN NaN
5 5 E0 2019-08-10 15:00:00 Watford Brighton 0 3 A 0 1 A C Pawson NaN NaN NaN NaN NaN NaN NaN NaN
6 6 E0 2019-08-10 17:30:00 Tottenham Aston Villa 3 1 H 0 1 A C Kavanagh NaN NaN NaN NaN NaN NaN NaN NaN
7 7 E0 2019-08-11 14:00:00 Leicester Wolves 0 0 D 0 0 D A Marriner NaN NaN NaN NaN NaN NaN NaN NaN
8 7084 G1 2004-09-18 NaN NaN NaN 0 1 A 0 0 D NaN NaN 1.83 1.83 1.66 1.95 0.5 Ergotelis Iraklis
9 7085 G1 2004-09-18 NaN NaN NaN 3 1 H 1 1 D NaN NaN 2.00 1.65 1.90 1.71 -0.5 Xanthi Aris
10 7086 G1 2004-09-19 NaN NaN NaN 1 0 H 1 0 H NaN NaN 2.00 1.65 1.85 1.85 0.0 Chalkidona Panionios
11 7087 G1 2004-09-19 NaN NaN NaN 1 1 D 0 0 D NaN NaN 1.83 1.83 1.67 1.95 0.5 Egaleo AEK
12 7088 G1 2004-09-19 NaN NaN NaN 1 0 H 1 0 H NaN NaN 1.85 1.79 1.85 1.85 0.0 Kalamaria OFI
13 7089 G1 2004-09-19 NaN NaN NaN 2 1 H 1 1 D NaN NaN NaN NaN NaN NaN NaN Olympiakos Kalithea
14 7090 G1 2004-09-19 NaN NaN NaN 3 0 H 2 0 H NaN NaN NaN NaN NaN NaN NaN Panathinaikos Ionikos
Expected df:
Unnamed: 0 Div Date Time HomeTeam AwayTeam FTHG FTAG FTR HTHG HTAG HTR Referee Unnamed: 62 GB>2.5 GB<2.5 GBAHH GBAHA GBAH HT AT
0 0 E0 2019-08-09 20:00:00 Liverpool Norwich 4 1 H 4 0 H M Oliver NaN NaN NaN NaN NaN NaN NaN NaN
1 1 E0 2019-08-10 12:30:00 West Ham Man City 0 5 A 0 1 A M Dean NaN NaN NaN NaN NaN NaN NaN NaN
2 2 E0 2019-08-10 15:00:00 Bournemouth Sheffield United 1 1 D 0 0 D K Friend NaN NaN NaN NaN NaN NaN NaN NaN
3 3 E0 2019-08-10 15:00:00 Burnley Southampton 3 0 H 0 0 D G Scott NaN NaN NaN NaN NaN NaN NaN NaN
4 4 E0 2019-08-10 15:00:00 Crystal Palace Everton 0 0 D 0 0 D J Moss NaN NaN NaN NaN NaN NaN NaN NaN
5 5 E0 2019-08-10 15:00:00 Watford Brighton 0 3 A 0 1 A C Pawson NaN NaN NaN NaN NaN NaN NaN NaN
6 6 E0 2019-08-10 17:30:00 Tottenham Aston Villa 3 1 H 0 1 A C Kavanagh NaN NaN NaN NaN NaN NaN NaN NaN
7 7 E0 2019-08-11 14:00:00 Leicester Wolves 0 0 D 0 0 D A Marriner NaN NaN NaN NaN NaN NaN NaN NaN
8 7084 G1 2004-09-18 NaN NaN NaN 0 1 A 0 0 D NaN NaN 1.83 1.83 1.66 1.95 0.5 NaN NaN
9 7085 G1 2004-09-18 NaN Ergotelis Iraklis 3 1 H 1 1 D NaN NaN 2.00 1.65 1.90 1.71 -0.5 NaN NaN
10 7086 G1 2004-09-19 NaN Xanthi Aris 1 0 H 1 0 H NaN NaN 2.00 1.65 1.85 1.85 0.0 NaN NaN
11 7087 G1 2004-09-19 NaN Chalkidona Panionios 1 1 D 0 0 D NaN NaN 1.83 1.83 1.67 1.95 0.5 NaN NaN
12 7088 G1 2004-09-19 NaN Egaleo AEK 1 0 H 1 0 H NaN NaN 1.85 1.79 1.85 1.85 0.0 NaN NaN
13 7089 G1 2004-09-19 NaN Kalamaria OFI 2 1 H 1 1 D NaN NaN NaN NaN NaN NaN NaN NaN NaN
14 7090 G1 2004-09-19 NaN Olympiakos Kalithea 3 0 H 2 0 H NaN NaN NaN NaN NaN NaN NaN NaN NaN
Essentially, I want to place non null values of HT and AT to HomeTeam and AwayTeam columns
There does not seem to be a straightforward way; there are many ways I guess;
Create a new column with an IF HT and AT not blank and HomeTeam and
AwayTeam blank then HT and AT else HomeTeam and AwayTeam
If (In column HomeTeam and AwayTeam) If HomeTeam and AwayTeam blank then HT
and AT else HomeTeam and Away Team.
How can I go about it in pandas?

You can do this considering df is your pandas Dataframe and you have imported NumPy as np
df = df.replace('', np.nan)
And after that apply a lambda function looking for the 'NaN' value like in the code below:
import pandas as pd
names = {'First_name': ['Jon','Bill','Maria','Emma']}
df = pd.DataFrame(names,columns=['First_name'])
df['name_match'] = df['First_name'].apply(lambda x: 'Match' if x == 'Bill' else 'Mismatch')
print (df)

Related

dropping a range of rows in a pandas data frame creates a key error

I have several different data frames, that I need to drop certain rows from. Each data frame has the same sequence of rows but located in different areas
Summary Results Report Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3
0 DEM President NaN NaN NaN NaN
1 Vote For 1 NaN NaN NaN NaN
2 NaN NaN Ballots By NaN Election
3 TOTAL NaN NaN Early Voting NaN
4 NaN NaN Mail NaN Day
5 Tom Steyer NaN 0 0 0 0
6 Andrew Yang NaN 0 0 0 0
7 John K. Delaney NaN 0 0 0 0
8 Cory Booker NaN 0 0 0 0
9 Michael R. Bloomberg NaN 4 1 1 2
10 Julian Castro NaN 0 0 0 0
11 Elizabeth Warren NaN 1 0 1 0
12 Marianne Williamson NaN 0 0 0 0
13 Deval Patrick NaN 0 0 0 0
14 Robby Wells NaN 0 0 0 0
15 Amy Klobuchar NaN 3 1 2 0
16 Tulsi Gabbard NaN 0 0 0 0
17 Michael Bennet NaN 0 0 0 0
18 Bernie Sanders NaN 4 0 1 3
19 Pete Buttigieg NaN 0 0 0 0
20 Joseph R. Biden 21.0 0 3 18
21 Roque "Rocky" De La Fuente NaN 0 0 0 0
22 Total Votes Cast 33.0 2 8 23
Summary Results Report Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5
0 DEM US Senator NaN NaN NaN NaN NaN NaN
1 Vote For 1 NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN Ballots By NaN Election NaN
3 TOTAL NaN NaN NaN Early Voting NaN NaN
4 NaN NaN NaN Mail NaN Day NaN
5 Jack Daniel Foster, Jr. 4.0 NaN 0 0 4 NaN
6 Mary (MJ) Hegar 4.0 NaN 1 3 0 NaN
7 Amanda K. Edwards 4.0 NaN 1 1 2 NaN
8 D. R. Hunter 1.0 NaN 0 0 1 NaN
9 Michael Cooper 3.0 NaN 0 0 3 NaN
10 Chris Bell 1.0 NaN 0 0 1 NaN
11 Royce West 3.0 NaN 0 0 3 NaN
12 Cristina Tzintzun Ramirez 5.0 NaN 0 3 2 NaN
13 Victor Hugo Harris 1.0 NaN 0 0 1 NaN
14 Sema Hernandez 1.0 NaN 0 0 1 NaN
15 Adrian Ocegueda 0.0 NaN 0 0 0 NaN
16 Annie "Mama" Garcia 3.0 NaN 0 1 2 NaN
17 Total Votes Cast 30 NaN NaN 2 8 20 NaN
18 DEM US Representative, Dist 1 NaN NaN NaN NaN NaN NaN
19 Vote For 1 NaN NaN NaN NaN NaN NaN
20 NaN NaN NaN Ballots By NaN Election NaN
21 TOTAL NaN NaN NaN Early Voting NaN NaN
22 NaN NaN NaN Mail NaN Day NaN
23 Hank Gilbert 26 NaN NaN 1 6 19 NaN
24 Total Votes Cast 26 NaN NaN 1 6 19 NaN
What I want to remove is the row that contains Vote for 1 in the first column, as well as the following 3 rows. The problem is that they can show in multiple areas, and in occasion multiple times (such as the second data frame). What I have seems to be working, in the aspect that it removes the required rows, however, at the end, it will give me a key error which tells me that it is re-looping through without any data.
for x in range(len(df)):
if 'Vote For 1' in str(df.iloc[:,0][x]):
y = x+3
df = df.drop(df.loc[x:y].index)
df.reset_index(drop=True,inplace=True)
df.index.name=None
print(df)
the code produces the following output:
Summary Results Report Unnamed: 0 Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4 Unnamed: 5
0 DEM US Senator NaN NaN NaN NaN NaN NaN
1 Jack Daniel Foster, Jr. 4.0 NaN 0 0 4 NaN
2 Mary (MJ) Hegar 4.0 NaN 1 3 0 NaN
3 Amanda K. Edwards 4.0 NaN 1 1 2 NaN
4 D. R. Hunter 1.0 NaN 0 0 1 NaN
5 Michael Cooper 3.0 NaN 0 0 3 NaN
6 Chris Bell 1.0 NaN 0 0 1 NaN
7 Royce West 3.0 NaN 0 0 3 NaN
8 Cristina Tzintzun Ramirez 5.0 NaN 0 3 2 NaN
9 Victor Hugo Harris 1.0 NaN 0 0 1 NaN
10 Sema Hernandez 1.0 NaN 0 0 1 NaN
11 Adrian Ocegueda 0.0 NaN 0 0 0 NaN
12 Annie "Mama" Garcia 3.0 NaN 0 1 2 NaN
13 Total Votes Cast 30 NaN NaN 2 8 20 NaN
14 DEM US Representative, Dist 1 NaN NaN NaN NaN NaN NaN
15 Hank Gilbert 26 NaN NaN 1 6 19 NaN
16 Total Votes Cast 26 NaN NaN 1 6 19 NaN
It errors out at the end with KeyError: 17. Any advice is greatly appreciated.
####EDIT####
I just wanted to give an update on the code that finally solved my problem. I know that it is probably a little robust, but it does work.
remove_strings=['Vote For 1','TOTAL']
remove_strings_list = df.index[df['Summary Results Report'].isin(remove_strings)].tolist()
df = df.drop(df.index[remove_strings_list])
Not exactly sure what your column names are, but is the summary column contains the names and the few names you want to remove, this should work. Else you may have to change the column name accordingly.
strings_to_remove = ['Vote for 1', 'Total', 'NaN']
df[~df.summary.isin(strings_to_remove)]

rolling moving average and std dev by multiple columns dynamically

I have a dataframe like this
import pandas as pd
import numpy as np
raw_data = {'Country':['UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','UK','US','US','US','US','US','US'],
'Product':['A','A','A','A','B','B','B','B','B','B','B','B','C','C','C','D','D','D','D','D','D'],
'Week': [1,2,3,4,1,2,3,4,5,6,7,8,1,2,3,1,2,3,4,5,6],
'val': [5,4,3,1,5,6,7,8,9,10,11,12,5,5,5,5,6,7,8,9,10]
}
df2 = pd.DataFrame(raw_data, columns = ['Country','Product','Week', 'val'])
print(df2)
i want to calculate moving average and std dev for val column by country and product..like 3 weeks,5 weeks ,7 weeks etc
wanted dataframe:
'Contry', 'product','week',val', '3wks_avg' '3wks_std','5wks_avg',5wks,std'..etc
Like WenYoBen suggested, we can create a list of all the window sizes you want, and then dynamically create your wanted columns with GroupBy.rolling:
weeks = [3, 5, 7]
for week in weeks:
df[[f'{week}wks_avg', f'{week}wks_std']] = (
df.groupby(['Country', 'Product']).rolling(window=week, on='Week')['val']
.agg(['mean', 'std']).reset_index(drop=True)
)
Country Product Week val 3wks_avg 3wks_std 5wks_avg 5wks_std 7wks_avg 7wks_std
0 UK A 1 5 nan nan nan nan nan nan
1 UK A 2 4 nan nan nan nan nan nan
2 UK A 3 3 4.00 1.00 nan nan nan nan
3 UK A 4 1 2.67 1.53 nan nan nan nan
4 UK B 1 5 nan nan nan nan nan nan
5 UK B 2 6 nan nan nan nan nan nan
6 UK B 3 7 6.00 1.00 nan nan nan nan
7 UK B 4 8 7.00 1.00 nan nan nan nan
8 UK B 5 9 8.00 1.00 7.00 1.58 nan nan
9 UK B 6 10 9.00 1.00 8.00 1.58 nan nan
10 UK B 7 11 10.00 1.00 9.00 1.58 8.00 2.16
11 UK B 8 12 11.00 1.00 10.00 1.58 9.00 2.16
12 UK C 1 5 nan nan nan nan nan nan
13 UK C 2 5 nan nan nan nan nan nan
14 UK C 3 5 5.00 0.00 nan nan nan nan
15 US D 1 5 nan nan nan nan nan nan
16 US D 2 6 nan nan nan nan nan nan
17 US D 3 7 6.00 1.00 nan nan nan nan
18 US D 4 8 7.00 1.00 nan nan nan nan
19 US D 5 9 8.00 1.00 7.00 1.58 nan nan
20 US D 6 10 9.00 1.00 8.00 1.58 nan nan
This is how you would get the moving average for 3 weeks :
df['3weeks_avg'] = list(df.groupby(['Country', 'Product']).rolling(3).mean()['val'])
Apply the same principle for the other columns you want to compute.
IIUC, you may try this
wks = ['Week_3', 'Week_5', 'Week_7']
df_calc = (df2.groupby(['Country', 'Product']).expanding().val
.agg(['mean', 'std']).rename(lambda x: f'Week_{x+1}', level=-1)
.query('ilevel_2 in #wks').unstack())
Out[246]:
mean std
Week_3 Week_5 Week_7 Week_3 Week_5 Week_7
Country Product
UK A 4.0 NaN NaN 1.0 NaN NaN
B NaN 5.0 6.0 NaN NaN 1.0
You will want to use a groupby-transform to get the rolling moments of your data. The following should compute what you are looking for:
weeks = [3, 5, 7] # define weeks
df2 = df2.sort_values('Week') # order by time
for i in weeks: # loop through time intervals you want to compute
df2['{}wks_avg'.format(i)] = df2.groupby(['Country', 'Product'])['val'].transform(lambda x: x.rolling(i).mean()) # i-week rolling mean
df2['{}wks_std'.format(i)] = df2.groupby(['Country', 'Product'])['val'].transform(lambda x: x.rolling(i).std()) # i-week rolling std
Here is what the resulting dataframe will look like.
print(df2.dropna().head().to_string())
Country Product Week val 3wks_avg 3wks_std 5wks_avg 5wks_std 7wks_avg 7wks_std
17 US D 3 7 6.0 1.0 6.0 1.0 6.0 1.0
6 UK B 3 7 6.0 1.0 6.0 1.0 6.0 1.0
14 UK C 3 5 5.0 0.0 5.0 0.0 5.0 0.0
2 UK A 3 3 4.0 1.0 4.0 1.0 4.0 1.0
7 UK B 4 8 7.0 1.0 7.0 1.0 7.0 1.0

replace values in dataframe with zeros and ones

I want to relace values in a dataframe, with a 0 where is a NaN value and with 1 where is a value.
here is my data:
AA AAPL FB GOOG TSLA XOM
Date
2018-02-28 NaN 0.068185 NaN NaN -0.031752 NaN
2018-03-31 -0.000222 NaN NaN NaN NaN -0.014920
2018-04-30 0.138790 NaN NaN NaN 0.104347 NaN
2018-05-31 NaN 0.135124 0.115 NaN NaN NaN
2018-06-30 NaN NaN NaN 0.028258 0.204474 NaN
2018-07-31 NaN 0.027983 NaN 0.091077 NaN NaN
2018-08-31 0.032355 0.200422 NaN NaN NaN NaN
2018-09-30 NaN -0.008303 NaN NaN NaN 0.060496
2018-10-31 NaN -0.030478 NaN NaN 0.274011 NaN
2018-11-30 NaN NaN NaN 0.016401 0.039013 NaN
2018-12-31 NaN NaN NaN -0.053745 -0.050445 NaN
Use mask and fillna:
df = df.mask(df.notna(), 1).fillna(0, downcast='infer')
Use:
df[df.notnull() == True] = 1
df.fillna(0, inplace=True)
Cast the Boolean values to int.
df.notnull().astype(int)
AA AAPL FB GOOG TSLA XOM
2018-02-28 0 1 0 0 1 0
2018-03-31 1 0 0 0 0 1
2018-04-30 1 0 0 0 1 0
2018-05-31 0 1 1 0 0 0
2018-06-30 0 0 0 1 1 0

counting dates not containing NaT and NaN in pandas dataframe

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]

how to assign values to a new data frame from another data frame in python

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

Categories

Resources