Год, TC_Number, Максимальная скорость ветра
data = pd.DataFrame({
'year': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2],
'TC_number': [0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
'maximum_wind_speed': [20.37199783, 21.2, 21.7, 14.626, 18.108, 21.4, 25.3, 25.3, 22.9, 18.108, 20.2, 22.1, 24.3, 25.5, 27.7, 29.8, 33.6, 36.7, 36.6, 35, 33, 29.7, 29, 20]})
Всем привет,
Я пытался найти решения, выполнив поиск в Интернете, но ни одно из них не похоже на то, что я ищу.
Я знаю, что я хочу сделать, но я застрял на том, как реализовать код.
Сначала я инициализирую массив (1000, 240). Затем я хочу создать цикл, который заполняет каждую строку массива. Каждая строка представляет зарегистрированные максимальные значения скорости ветра для одного тропического циклона (TC), а 240 представляет максимальное количество значений, которое может иметь TC. Однако каждый TC будет иметь различное количество значений, записанных в строке максимальных скоростей ветра. Я хочу, чтобы цикл переходил к следующей строке, когда текущий номер TC не равен предыдущему номеру TC.
Это то, что у меня есть до сих пор:
output_array = np.full((1000, 240), np.nan)
#Shape of vmaxsyn is (337079,)
for i in range(1000):
#print("i = ", i)
for j in range(241):
#print("j = ", j)
name_id1 = df.iloc[j]['TC_number']
name_id2 = df.iloc[j-1]['TC_number']
if name_id1 == name_id2:
output_array[i, j] = vmaxsyn[j]
#print(output_array[j,i])
#print([i,j])
else:
#print("breaking out of inner loop")
break
#print("breaking out of outer loop.")
Я ожидал чего-то вроде этого:
data = [
[20.372, 21.2, 21.7, 14.62, np.nan, np.nan],
[18.108, 21.4, 25.3, 25.3, 22.9, np.nan],
[18.108, 20.2, 22.1, 24.3, np.nan, np.nan],
[25.5, 27.1, 29.8, 33.6, np.nan, np.nan],
[36.7, 36.6, 35, np.nan, np.nan, np.nan],
[33, 29.7, 29, np.nan, np.nan, np.nan]]
Проблема в том, что ни одно из значений vmaxsyn не записывается в мой выходной массив. И я также пытаюсь справиться с ошибкой широковещания с помощью другого подхода. Любая помощь приветствуется. Я специально пытаюсь сделать это с пандами.
Привет Марк, Спасибо за ваш ответ. Я сделаю, как вы посоветовали, и отредактирую свой пост. Извините, первый раз здесь.
почему вы используете j, когда устанавливаете и name_id1, и namd_id2? Если вы собираетесь сделать только это, разве вы не получите один и тот же ответ независимо от того, что находится во внешнем цикле?
@ChrisSharp Я пытался использовать j во внутреннем цикле для сравнения каждого TC_number. И когда TC_numbers не равны, выйти на внешний цикл, чтобы начать новую строку.
Я понимаю, но разве ты не делаешь одно и то же 1000 раз?
@ChrisSharp О, понятно. Хорошо. Я посмотрю, как исправить эту часть. Думаю, отсюда и мои беды. Спасибо.
@ChrisSharp Хорошо! Это лучше, чем то, с чего я начал! Спасибо. Значения из vmaxsyn записываются в 2D-массив. Но он не переходит в следующую строку. Я думаю, это означает, что мое условие неверно. Я посмотрю на это сейчас.
Убедитесь, что вы получили первое значение перед входом во второй цикл. Вы хотите сравнить его только с как можно меньшим числом из 241 значения. Но одной вещи, которую я еще не понял, является то, почему вы перебираете одну и ту же структуру данных в обоих циклах. Разве один не должен быть списком констант, а другой - вашими входными данными?
Я предполагаю, что ответ: я не знаю, как перебирать мои входные данные. Вот почему я использовал 240 для внутреннего цикла, так как знаю, что vmaxsyn никогда не должно превышать 240 значений. Я предполагаю, что цикл перейдет к следующей строке до того, как внутренний цикл достигнет 240. Но теперь я узнаю, что мой внутренний цикл ломается только потому, что он достигает 240.






Я не совсем понял, как у вас массивы ввода/вывода, но вы можете сделать что-то вроде этого:
array = np.full((1000, 240), np.nan)
last = None
i = 0
for tc_number, wind_speed in zip(tc_numbers_input, wind_speeds_input): # replace by your values
if last != tc:
i = 0
last = tc
array[tc][i] = speed
i += 1
Использование массива размера (10, 10) с входными данными, которые вы дали, дает это
(print([list(x) for x in array]))
[
[20.37199783, 21.2, 21.7, 14.626, nan, nan, nan, nan, nan, nan],
[18.108, 21.4, 25.3, 25.3, 22.9, nan, nan, nan, nan, nan],
[18.108, 20.2, 22.1, 24.3, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
...
]
Это круто! Наверное, теперь мне интересно, почему он остановился на 3-м ряду?
Вы не предоставили больше информации
посмотрите на фрейм данных, который вы дали
Ой! Извини за это. Я не уверен, почему его отрезали. Я исправил это. Я воспользуюсь вашим методом.
Странно, что это происходит. Ввожу: print("Last TC Number = ", last_tc_number) print("TC_number = ", tc_number) print("i = ", i) print(wind_speed) и вроде все работает, но заполнено только 3 строки со значениями, когда я пытаюсь распечатать весь массив.
Итак, я столкнулся с проблемами array[tc_number][i] = wind_speed. Проблема возникает, когда tc_number сбрасывается до 0 при начале нового года. Я думаю, именно поэтому я получаю только 3 строки для печати.
Этот ответ явно неверен, поскольку он не учитывает, что TC_number в data не является последовательным. Кроме того, внутри цикла for есть несколько неопределенных переменных, таких как tc.
Здесь вообще не нужна петля for. Сначала добавьте к своим данным один столбец id, который увеличивается при изменении TC_number. Затем сгруппируйте свои данные по этому вновь созданному id и используйте pandas.DataFrame.apply для преобразования их в список.
data['tc_id'] = data['TC_number'].ne(data['TC_number'].shift()).cumsum()-1
array = data.groupby('tc_id')['maximum_wind_speed'].apply(list)
Результат будет выглядеть
print(array)
tc_id
0 [20.37199783, 21.2, 21.7, 14.626]
1 [18.108, 21.4, 25.3, 25.3, 22.9]
2 [18.108, 20.2, 22.1, 24.3]
3 [25.5, 27.7, 29.8, 33.6]
4 [36.7, 36.6, 35.0]
5 [33.0, 29.7, 29.0, 20.0]
Это гениально! Ух ты!! Может быть, у вас есть учебные материалы, чтобы узнать больше о таких вещах, как .ne(data['TC_number'].shift()).cumsum()-1? Спасибо!
Действительно, я бы рекомендовал переполнение стека для изучения таких вещей. Найдите вопросы, похожие на «Как мне добавить столбец во фрейм данных, который увеличивается на единицу каждый раз, когда его значение изменяется?» и попробуй их разгадать, узнай из ответов...
Похоже, вы ищете groupby. Вы получите лучшие ответы, если сможете свести свои проблемы к чему-то небольшому, автономному и запускаемому другими без доступа к вашим данным. Попробуйте выразить проблему с помощью нескольких значений-заполнителей, и вам не придется объяснять почти столько же в тексте. (Кроме того, обратите внимание, что многие люди не будут смотреть на изображения, а изображения доступны не всем… все соответствующие данные должны быть указаны в вопросе в виде текста/кода)