I have this code, it’s working for the first 9 itterations and then I get the SettingWithCopyWarning and it doesnt continue on, what can I do?
JavaScript
x
33
33
1
df_day = df.copy()
2
date = df_day['Date']
3
df_day['Day'] = 'N/A'
4
x = 0
5
for str in df_day:
6
df_day['Day'][x] = datetime.datetime.strptime(date[x], '%d/%m/%Y').weekday()
7
x = x + 1
8
y = 0
9
10
for int in df_day['Day']:
11
if df_day['Day'][y] == 0:
12
df_day['Day'][y] = 'Monday'
13
y = y + 1
14
elif df_day['Day'][y] == 1:
15
df_day['Day'][y] = 'Tuesday'
16
y = y + 1
17
elif df_day['Day'][y] == 2:
18
df_day['Day'][y] = 'Wednesday'
19
y = y + 1
20
elif df_day['Day'][y] == 3:
21
df_day['Day'][y] = 'Thursday'
22
y = y + 1
23
elif df_day['Day'][y] == 4:
24
df_day['Day'][y] = 'Friday'
25
y = y + 1
26
elif df_day['Day'][y] == 5:
27
df_day['Day'][y] = 'Saturday'
28
y = y + 1
29
elif df_day['Day'][y] == 6:
30
df_day['Day'][y] = 'Sunday'
31
y = y + 1
32
df_day.head(15)
33
So I have this now, but it still only runs through the first 10 lines of data! Something to do with the first for loop I think! (I know it’s still a for loop but its been requested as being in a for loop!)
JavaScript
1
36
36
1
x = 0
2
for int in df_day:
3
if x < length_data_day:
4
df_day.loc[x,'Day'] = datetime.datetime.strptime(date[x], '%d/%m/%Y').weekday()
5
x = x + 1
6
elif x == length_data_day:
7
end
8
df_day.head(15)
9
y = 0
10
for int in df_day['Day']:
11
if df_day.loc[y,'Day'] == 0:
12
df_day.loc[y,'Day'] = 'Monday'
13
y = y + 1
14
elif df_day.loc[y,'Day'] == 1:
15
df_day.loc[y,'Day'] = 'Tuesday'
16
y = y + 1
17
elif df_day.loc[y,'Day'] == 2:
18
df_day.loc[y,'Day'] = 'Wednesday'
19
y = y + 1
20
elif df_day.loc[y,'Day'] == 3:
21
df_day.loc[y,'Day'] = 'Thursday'
22
y = y + 1
23
elif df_day.loc[y,'Day'] == 4:
24
df_day.loc[y,'Day'] = 'Friday'
25
y = y + 1
26
elif df_day.loc[y,'Day'] == 5:
27
df_day.loc[y,'Day'] = 'Saturday'
28
y = y + 1
29
elif df_day.loc[y,'Day'] == 6:
30
df_day.loc[y,'Day'] = 'Sunday'
31
y = y + 1
32
else:
33
df_day.loc[y,'Day'] = 'Error'
34
y = y + 1
35
df_day.head(15)
36
Advertisement
Answer
You’re chaining your indexes (e.g., dataframe[col_index][row_index]
.
In general, you should use
dataframe.loc[row_index, col_index]
dataframe.iloc[row_index, col_index]
dataframe.at[row_index, col_index]
dataframe.iat[row_index, col_index]
But in your case, you don’t need any of that. In fact, you rarely need to loop through a dataframe.
In your case, I would do:
JavaScript
1
17
17
1
day_names= {
2
0: 'Monday',
3
1: 'Tuesday',
4
2: 'Wednesday',
5
3: 'Thursday',
6
4: 'Friday',
7
5: 'Saturday',
8
6: 'Sunday'
9
}
10
11
df_day = (
12
df.assign(Date=lambda df: pandas.to_datetime(df['Date']))
13
.assign(WeekDayNum=lambda df: df['Date']).dt.weekday)
14
.assign(WeekDayName=lambda df: df['WeekDayNum']).map(day_names))
15
)
16
17
Or, you could be more clever about how your use your date objects:
JavaScript
1
10
10
1
import numpy
2
import pandas
3
x = ['01/01/2020', '02/01/2020', '03/01/2020', '04/01/2020', '05/01/2020',
4
'06/01/2020', '07/01/2020', '08/01/2020', '09/01/2020']
5
(
6
pandas.DataFrame({'DateString': x, 'N': numpy.arange(len(x))})
7
.assign(Date=lambda df: pandas.to_datetime(df['DateString'], format='%d/%m/%Y'))
8
.assign(Weekday=lambda df: df['Date'].dt.strftime('%A'))
9
)
10
And that gives me:
JavaScript
1
11
11
1
DateString N Date Weekday
2
0 01/01/2020 0 2020-01-01 Wednesday
3
1 02/01/2020 1 2020-01-02 Thursday
4
2 03/01/2020 2 2020-01-03 Friday
5
3 04/01/2020 3 2020-01-04 Saturday
6
4 05/01/2020 4 2020-01-05 Sunday
7
5 06/01/2020 5 2020-01-06 Monday
8
6 07/01/2020 6 2020-01-07 Tuesday
9
7 08/01/2020 7 2020-01-08 Wednesday
10
8 09/01/2020 8 2020-01-09 Thursday
11