Merging the multiple columns - python

I have a dataframe like this (actual data has 70 columns with timestamp) with Column name as A_Timestamp, BC_Timestamp, DA_Timestamp, CA_Timestamp, B_Values, C_values, D_Values, Q_Values
A_Timestamp
B_Values
2020-11-08 11:15:00
1
2020-11-10 15:34:00
2
BC_Timestamp
C_Values
2020-11-11 12:13:00
8
2020-11-15 02:47:00
4
DA_Timestamp
D_Values
2020-1-13 14:47:00
3
2020-11-9 5:34:00
5
CA_Timestamp
Q_Values
2020-7-18 01:04:00
7
2020-04-10 16:34:00
6
And I want Like this:
| Timestamp | |B_Values| C_values| D_values| Q_Values|
| 2020-11-08 11:15:00 | 1 | Nan | Nan | Nan|
| 2020-11-10 15:34:00 | 2 | Nan | Nan | Nan |
| 2020-11-11 12:13:00 | Nan | 8 | Nan | Nan|
| 2020-11-15 02:47:00 | Nan | 4 | Nan | Nan|
| 2020-1-13 14:47:00 | Nan | Nan | 3 | Nan|
| 2020-11-9 05:34:00 | Nan | Nan | 5 | Nan|
| 2020-7-18 01:04:00 | Nan | Nan | Nan | 7|
I want to merge all the columns ending with 'Timestamp' into one single column. And each timestamp with their respective value in the respective columns.

You can use a renamer for the Timestamp column:
dfs = [df1, df2, df3, df4]
renamer = lambda x: 'Timestamp' if x.endswith('Timestamp') else x
out = pd.concat([d.rename(renamer, axis=1) for d in dfs])
Output:
Timestamp B_Values C_Values D_Values Q_Values
0 2020-11-08 11:15:00 1.0 NaN NaN NaN
1 2020-11-10 15:34:00 2.0 NaN NaN NaN
0 2020-11-11 12:13:00 NaN 8.0 NaN NaN
1 2020-11-15 02:47:00 NaN 4.0 NaN NaN
0 2020-1-13 14:47:00 NaN NaN 3.0 NaN
1 2020-11-9 5:34:00 NaN NaN 5.0 NaN
0 2020-7-18 01:04:00 NaN NaN NaN 7.0
1 2020-04-10 16:34:00 NaN NaN NaN 6.0
alternative
Assuming you have a single DataFrame as input:
A_Timestamp B_Values BC_Timestamp C_Values DA_Timestamp D_Values CA_Timestamp Q_Values
0 2020-11-08 11:15:00 1 2020-11-11 12:13:00 8 2020-1-13 14:47:00 3 2020-7-18 01:04:00 7
1 2020-11-10 15:34:00 2 2020-11-15 02:47:00 4 2020-11-9 5:34:00 5 2020-04-10 16:34:00 6
You can then reshape with a MultiIndex:
m = df.columns.str.endswith('Timestamp')
s = df.columns.to_series().mask(m)
out = (df
.set_axis(pd.MultiIndex.from_arrays(
[s.bfill(), s.fillna('Timestamp')]), axis=1)
.T.stack().unstack(-2).droplevel(0)
)
Output:
B_Values C_Values D_Values Q_Values Timestamp
0 1 NaN NaN NaN 2020-11-08 11:15:00
1 2 NaN NaN NaN 2020-11-10 15:34:00
0 NaN 8 NaN NaN 2020-11-11 12:13:00
1 NaN 4 NaN NaN 2020-11-15 02:47:00
0 NaN NaN 3 NaN 2020-1-13 14:47:00
1 NaN NaN 5 NaN 2020-11-9 5:34:00
0 NaN NaN NaN 7 2020-7-18 01:04:00
1 NaN NaN NaN 6 2020-04-10 16:34:00
Or, if order of the rows doesn't matter:
m = df.columns.str.endswith('Timestamp')
s = df.columns.to_series().mask(m)
(df.set_axis(pd.MultiIndex.from_arrays(
[s.fillna('Timestamp'), s.bfill()]), axis=1)
.stack()
)

Related

Python - search spreadsheet for cell containing datetime string

I'm a Python newbie and this is my first SO post. I'm trying to use python to extract a datestamp from a cell in a spreadsheet. I tried the following:
df = pd.read_excel(fileName, sheet_name=0)
df_columns = dict(zip(df.columns,range(len(df.columns))))
df_start = df.rename(columns=df_columns)
for i in range(0, len(df.columns)):
for j in range(0, 4):
if isinstance(df.iloc[i,j],str) and ':' in df.loc[i,j]:
datestamp = datetime.datetime.strptime(df.iloc[i,j], '%d/%m/%Y %H:%M:%S')
break
I'm getting an error message "Error at 0".
Dataframe looks something like this:
| 0 | 1 | 2 |...| 10 | 11 | 12 |
|---- | ----| --- |...|---- | ------------------------| --- |
| NaN | NaN | NaN |...| NaN | 2022-09-16 16:47:21.852 | NaN |
| NaN | NaN | NaN |...| NaN | 2022-09-16 16:47:21.852 | NaN |
| NaN | NaN | NaN |...| NaN | NaN | NaN |
| NaN | NaN | NaN |...| NaN | NaN | NaN |
| NaN |ClientName |Client Number |...|Core | Core Description | Status |
| NaN |AB09403880 |9403880|...|NaN | NaN | Active |
| NaN |AB09403881 |9403881|...|NaN | NaN | Active |
| NaN |AB09403882 |9403883|...|NaN | NaN | Active |
EDIT: I want to extract the datestamp in this spreadsheet to add as a column to a different dataframe which will eventually be written to CSV file. I should also add that the column where the date stamp is located is not necessarily going to be in column 11 (row 1 & 2) in the spreadsheet hence my attempt to loop through the cells. Hope that makes sense.
EDIT 2: Updated additional rows of dataframe
Expected Output:
| Datestamp|ClientName |Client Number |...|Core | Core Description | Status |
| 2022-09-16 |AB09403880 |9403880|...|NaN | NaN | Active |
| 2022-09-16 |AB09403881 |9403881|...|NaN | NaN | Active |
| 2022-09-16 |AB09403882 |9403883|...|NaN | NaN | Active |
Considering that your Excel files has only timestamps values distributed in multiple rows/cols (see example/dataframe below) :
import pandas as pd
df = pd.read_excel("myinnernerd.xlsx")
print(df)
0 1 2 3 4 5 6 7 8 9 10 11 12
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2022-09-16 16:47:21.852 NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2022-09-16 16:47:21.852 NaN
2 NaN NaN NaN NaN NaN 2022-09-16 16:47:21.852 NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 2022-09-16 16:47:21.852 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2022-09-16 16:47:21.852 NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN 2022-09-16 16:47:21.852 2022-09-16 16:47:21.852 NaN NaN NaN NaN NaN NaN NaN
8 NaN NaN NaN NaN 2022-09-16 16:47:21.852 NaN NaN NaN NaN NaN NaN NaN NaN
9 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2022-09-16 16:47:21.852
You can use pandas.DataFrame.stack to intersect all the columns then pandas.DataFrame.explode to explode the rows with eventually multiple timestamps :
f = lambda x: list(x) if len(x) > 1 else x
df['datestamp'] = df.stack().groupby(level=0).agg(f)
df = df.pop('datestamp').dropna().explode().to_frame()
After that, convert the column datestamp to a datetime object by using pandas.to_datetime then floor it by seconds 'S'.
df['datestamp'] = pd.to_datetime(df['datestamp']).dt.floor('S')
print(df)
datestamp
0 2022-09-16 16:47:21
1 2022-09-16 16:47:21
2 2022-09-16 16:47:21
4 2022-09-16 16:47:21
4 2022-09-16 16:47:21
7 2022-09-16 16:47:21
7 2022-09-16 16:47:21
8 2022-09-16 16:47:21
10 2022-09-16 16:47:21
print(df.dtypes)
datestamp datetime64[ns]
dtype: object
This worked for me, but only because there are no other datestamps in the excel file:
def rep_date(df):
x = df.select_dtypes(include=[np.datetime64])
y = x.iloc[1].dt.strftime('%Y-%m-%d %H:%M:%S.%f').to_string(index=False)
return y

Replace nan values with data from previous months

I have a DataFrame as follows. This DataFrame contains NAN values. I want to replace nan values with the earlier non nan value in my DataFrame from previous month(s):
date (y-d-m) | value
2022-01-01 | 1
2022-02-01 | 2
2022-03-01 | 3
2022-04-01 | 4
...
2022-01-02 | nan
2022-02-02 | nan
2022-03-02 | nan
2022-04-02 | nan
...
2022-01-03 | nan
2022-02-03 | nan
2022-03-03 | nan
2022-04-03 | nan
Desired outcome
date (y-d-m) | value
2022-01-01 | 1
2022-02-01 | 2
2022-03-01 | 3
2022-04-01 | 4
...
2022-01-02 | 1
2022-02-02 | 2
2022-03-02 | 3
2022-04-02 | 4
...
2022-01-03 | 1
2022-02-03 | 2
2022-03-03 | 3
2022-04-03 | 4
Data:
{'date (y-d-m)': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01',
'2022-01-02', '2022-02-02', '2022-03-02', '2022-04-02',
'2022-01-03', '2022-02-03', '2022-03-03', '2022-04-03'],
'value': [1.0, 2.0, 3.0, 4.0, nan, nan, nan, nan, nan, nan, nan, nan]}
You could convert "date (y-d-m)" column to datetime; then groupby "day" and forward fill with ffill (values from previous months' same day):
df['date (y-d-m)'] = pd.to_datetime(df['date (y-d-m)'], format='%Y-%d-%m')
df['value'] = df.groupby(df['date (y-d-m)'].dt.day)['value'].ffill()
Output:
date (y-d-m) value
0 2022-01-01 1.0
1 2022-01-02 2.0
2 2022-01-03 3.0
3 2022-01-04 4.0
4 2022-02-01 1.0
5 2022-02-02 2.0
6 2022-02-03 3.0
7 2022-02-04 4.0
8 2022-03-01 1.0
9 2022-03-02 2.0
10 2022-03-03 3.0
11 2022-03-04 4.0

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

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)

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