#python #python-3.x #pandas #dataframe #for-loop
Вопрос:
Фреймы данных:
# frames
winter1 = pd.DataFrame({"Location #1":{"1":0.999103,"2":0.999103,"3":0.999103,"4":0.999103,"5":0.999103,"6":0.999103,"7":0.999103,"8":0.999103,"9":0.999103,"10":0.999103,"11":0.999103,"12":0.999103,"13":0.999103,"14":0.999103,"15":0.999103,"16":0.999103,"17":0.999103,"18":0.999103,"19":0.999103,"20":0.999103,"21":0.999103,"22":0.999103,"23":0.999103,"24":0.999103},"Location #2":{"1":1.001673,"2":1.001673,"3":1.001673,"4":1.001673,"5":1.001673,"6":1.001673,"7":1.001673,"8":1.001673,"9":1.001673,"10":1.001673,"11":1.001673,"12":1.001673,"13":1.001673,"14":1.001673,"15":1.001673,"16":1.001673,"17":1.001673,"18":1.001673,"19":1.001673,"20":1.001673,"21":1.001673,"22":1.001673,"23":1.001673,"24":1.001673},"Location #3":{"1":0.999382,"2":0.999382,"3":0.999382,"4":0.999382,"5":0.999382,"6":0.999382,"7":0.999382,"8":0.999382,"9":0.999382,"10":0.999382,"11":0.999382,"12":0.999382,"13":0.999382,"14":0.999382,"15":0.999382,"16":0.999382,"17":0.999382,"18":0.999382,"19":0.999382,"20":0.999382,"21":0.999382,"22":0.999382,"23":0.999382,"24":0.999382},"Location #4":{"1":0.998544,"2":0.998544,"3":0.998544,"4":0.998544,"5":0.998544,"6":0.998544,"7":0.998544,"8":0.998544,"9":0.998544,"10":0.998544,"11":0.998544,"12":0.998544,"13":0.998544,"14":0.998544,"15":0.998544,"16":0.998544,"17":0.998544,"18":0.998544,"19":0.998544,"20":0.998544,"21":0.998544,"22":0.998544,"23":0.998544,"24":0.998544},"Location #5":{"1":1.00267,"2":1.00267,"3":1.00267,"4":1.00267,"5":1.00267,"6":1.00267,"7":1.00267,"8":1.00267,"9":1.00267,"10":1.00267,"11":1.00267,"12":1.00267,"13":1.00267,"14":1.00267,"15":1.00267,"16":1.00267,"17":1.00267,"18":1.00267,"19":1.00267,"20":1.00267,"21":1.00267,"22":1.00267,"23":1.00267,"24":1.00267}})
df_winter_min_error = pd.DataFrame({"Location #1":{"Position of min value":2,"Position of max value":19},"Location #2":{"Position of min value":4,"Position of max value":19},"Location #3":{"Position of min value":5,"Position of max value":15},"Location #4":{"Position of min value":5,"Position of max value":20},"Location #5":{"Position of min value":7,"Position of max value":20}})
У меня есть фрейм данных pandas, winter1
который выглядит следующим образом. Он состоит из значений за 24 часа для пяти различных местоположений.
Location #1 Location #2 Location #3 Location #4 Location #5
Hours
1 0.999103 1.001673 0.999382 0.998544 1.00267
2 0.999103 1.001673 0.999382 0.998544 1.00267
3 0.999103 1.001673 0.999382 0.998544 1.00267
4 0.999103 1.001673 0.999382 0.998544 1.00267
5 0.999103 1.001673 0.999382 0.998544 1.00267
6 0.999103 1.001673 0.999382 0.998544 1.00267
7 0.999103 1.001673 0.999382 0.998544 1.00267
8 0.999103 1.001673 0.999382 0.998544 1.00267
9 0.999103 1.001673 0.999382 0.998544 1.00267
10 0.999103 1.001673 0.999382 0.998544 1.00267
11 0.999103 1.001673 0.999382 0.998544 1.00267
12 0.999103 1.001673 0.999382 0.998544 1.00267
13 0.999103 1.001673 0.999382 0.998544 1.00267
14 0.999103 1.001673 0.999382 0.998544 1.00267
15 0.999103 1.001673 0.999382 0.998544 1.00267
16 0.999103 1.001673 0.999382 0.998544 1.00267
17 0.999103 1.001673 0.999382 0.998544 1.00267
18 0.999103 1.001673 0.999382 0.998544 1.00267
19 0.999103 1.001673 0.999382 0.998544 1.00267
20 0.999103 1.001673 0.999382 0.998544 1.00267
21 0.999103 1.001673 0.999382 0.998544 1.00267
22 0.999103 1.001673 0.999382 0.998544 1.00267
23 0.999103 1.001673 0.999382 0.998544 1.00267
24 0.999103 1.001673 0.999382 0.998544 1.00267
Значения определенных столбцов для определенных часов должны быть равны 1 на основе значений в двух строках другого вызываемого фрейма данных pandas df_winter_min_error
, который выглядит следующим образом:
df_winter_min_error.iloc[-2:,:]
Location #1 Location #2 Location #3 Location #4 Location #5
Hours
Position of min value 2.0 4.0 5.0 5.0 7.0
Position of max value 19.0 19.0 15.0 20.0 20.0
Исходя из приведенного выше значения в df_winter_min_error
, конкретное значение в winter1 необходимо изменить на 1. например, для местоположения № 1 минимальное значение и максимальное значение равны 2 и 19 часам соответственно. Поэтому мне нужно сделать значения для winter1.loc[2,»Местоположение № 1″] и winter1.loc[19, «Местоположение № 1»] равными 1, заменив существующие значения. Я хочу автоматизировать этот процесс, так как это также необходимо сделать для всех мест в соответствующие часы.
Я попробовал следующий код, однако, похоже, он ничего не меняет. Я также попытался изменить код, однако это привело к различным ошибкам, таким как ошибка ключа и ошибка индексирования.
locations = ["Location #1", "Location #2","Location #3","Location #4","Location #5"]
for location in locations:
for index, row in winter1.iterrows():
for location in locations:
if [index] in df_winter_min_error[location][-2:].astype(int).values.tolist():
row.loc[index,location]=1
Каким может быть подходящий способ автоматизации этого процесса, поскольку его необходимо применять к каждой строке (часам) и каждому столбцу (местоположениям)?
Ответ №1:
Может быть, учитывая:
# frames
winter1 = pd.DataFrame({"Location #1":{"1":0.999103,"2":0.999103,"3":0.999103,"4":0.999103,"5":0.999103,"6":0.999103,"7":0.999103,"8":0.999103,"9":0.999103,"10":0.999103,"11":0.999103,"12":0.999103,"13":0.999103,"14":0.999103,"15":0.999103,"16":0.999103,"17":0.999103,"18":0.999103,"19":0.999103,"20":0.999103,"21":0.999103,"22":0.999103,"23":0.999103,"24":0.999103},"Location #2":{"1":1.001673,"2":1.001673,"3":1.001673,"4":1.001673,"5":1.001673,"6":1.001673,"7":1.001673,"8":1.001673,"9":1.001673,"10":1.001673,"11":1.001673,"12":1.001673,"13":1.001673,"14":1.001673,"15":1.001673,"16":1.001673,"17":1.001673,"18":1.001673,"19":1.001673,"20":1.001673,"21":1.001673,"22":1.001673,"23":1.001673,"24":1.001673},"Location #3":{"1":0.999382,"2":0.999382,"3":0.999382,"4":0.999382,"5":0.999382,"6":0.999382,"7":0.999382,"8":0.999382,"9":0.999382,"10":0.999382,"11":0.999382,"12":0.999382,"13":0.999382,"14":0.999382,"15":0.999382,"16":0.999382,"17":0.999382,"18":0.999382,"19":0.999382,"20":0.999382,"21":0.999382,"22":0.999382,"23":0.999382,"24":0.999382},"Location #4":{"1":0.998544,"2":0.998544,"3":0.998544,"4":0.998544,"5":0.998544,"6":0.998544,"7":0.998544,"8":0.998544,"9":0.998544,"10":0.998544,"11":0.998544,"12":0.998544,"13":0.998544,"14":0.998544,"15":0.998544,"16":0.998544,"17":0.998544,"18":0.998544,"19":0.998544,"20":0.998544,"21":0.998544,"22":0.998544,"23":0.998544,"24":0.998544},"Location #5":{"1":1.00267,"2":1.00267,"3":1.00267,"4":1.00267,"5":1.00267,"6":1.00267,"7":1.00267,"8":1.00267,"9":1.00267,"10":1.00267,"11":1.00267,"12":1.00267,"13":1.00267,"14":1.00267,"15":1.00267,"16":1.00267,"17":1.00267,"18":1.00267,"19":1.00267,"20":1.00267,"21":1.00267,"22":1.00267,"23":1.00267,"24":1.00267}})
df_winter_min_error = pd.DataFrame({"Location #1":{"Position of min value":2,"Position of max value":19},"Location #2":{"Position of min value":4,"Position of max value":19},"Location #3":{"Position of min value":5,"Position of max value":15},"Location #4":{"Position of min value":5,"Position of max value":20},"Location #5":{"Position of min value":7,"Position of max value":20}})
И как образец winter1
того, как это выглядит..
Location #1 Location #2 Location #3 Location #4 Location #5
2 0.999103 1.001673 0.999382 0.998544 1.00267
19 0.999103 1.001673 0.999382 0.998544 1.00267
И df_winter_min_error
:
Location #1 Location #2 Location #3 Location #4 Location #5
Position of min value 2 4 5 5 7
Position of max value 19 19 15 20 20
Чтобы изменить все столбцы, попробуйте:
for col in winter1.columns:
mask = winter1.index.isin(df_winter_min_error[col].astype(str))
winter1[col][mask] = 1
Выходной образец winter1
:
winter1.loc[['2', '4', '5', '7', '15', '19', '20']]
Location #1 Location #2 Location #3 Location #4 Location #5
2 1.000000 < 1.001673 0.999382 0.998544 1.00267
4 0.999103 1.000000 < 0.999382 0.998544 1.00267
5 0.999103 1.001673 1.000000 < 1.000000 < 1.00267
7 0.999103 1.001673 0.999382 0.998544 1.00000 <
15 0.999103 1.001673 1.000000 < 0.998544 1.00267
19 1.000000 < 1.000000 < 0.999382 0.998544 1.00267
20 0.999103 1.001673 0.999382 1.000000 < 1.00000 <
Комментарии:
1. Спасибо. Это сработало для меня. Индекс winter1.имел тип int. Поэтому я также преобразовал df_winter_min_error[col].astype(int), который был типа float.