Панды: Найдите максимальное значение столбца, затем найдите другое значение в одной строке и скопируйте это значение в нPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Панды: Найдите максимальное значение столбца, затем найдите другое значение в одной строке и скопируйте это значение в н

Сообщение Anonymous »

У меня есть следующий кадр: < /p>

Код: Выделить всё

lst = [['SPXW 250715C06310000', '7/14/2025', 2.74, 2.87, 2.60, 2.65, 14, '8:30:00'],
['SPXW 250715C06310000', '7/14/2025', 2.80, 2.80, 2.50, 2.53, 61, '8:31:00'],
['SPXW 250715C06310000', '7/14/2025', 2.45, 2.45, 2.45, 2.45, 2, '8:32:00'],
['SPXW 250715C06310000', '7/14/2025', 2.58, 2.80, 2.58, 2.60, 32, '8:33:00'],
['SPXW 250715C06310000', '7/14/2025', 2.50, 2.50, 2.25, 2.30, 5, '8:34:00'],
['SPXW 250709C06345000', '7/9/2025', 0.05, 0.05, 0.03, 0.03, 246, '8:30:00'],
['SPXW 250709C06345000', '7/9/2025', 0.05, 0.10, 0.03, 0.07, 452, '8:31:00'],
['SPXW 250709C06345000', '7/9/2025', 0.07, 0.10, 0.05, 0.07, 137, '8:32:00'],
['SPXW 250709C06345000', '7/9/2025', 0.07, 0.07, 0.07, 0.07, 5, '8:33:00'],
['SPXW 250709C06345000', '7/9/2025', 0.07, 0.07, 0.05, 0.05, 225, '8:34:00'],
['SPXW 250715C06310000', '7/11/2025', 7.30, 7.30, 7.30, 7.30, 2, '8:30:00'],
['SPXW 250715C06310000', '7/11/2025', 7.20, 7.20, 7.20, 7.20, 2, '8:31:00'],
['SPXW 250715C06310000', '7/11/2025', 6.92, 6.92, 6.92, 6.92, 20, '8:32:00'],
['SPXW 250715C06310000', '7/11/2025', 6.58, 6.58, 6.58, 6.58, 1, '8:34:00'],
['SPXW 250715C06310000', '7/11/2025', 6.41, 6.41, 6.41, 6.41, 2, '8:35:00']
]
df = pd.DataFrame(lst, columns = ['Symbol', 'Date', 'open', 'high', 'low', 'close', 'volume', 'hour'])

df['Date'] = pd.to_datetime(df['Date'])
df['hour'] = pd.to_datetime(df['hour'], format='%H:%M:%S')
df.index = pd.MultiIndex.from_arrays([df['Symbol'], df['Date']], names=['Symbol', 'Date'])
df.drop(columns=['Symbol', 'Date'], inplace=True)
df["day_high"] = ""
df["day_low"] = ""
df["day_high_time"] = ""
df["day_low_time"] = ""

mask = df['hour'].dt.strftime('%H:%M').eq('08:30')
df.loc[mask, 'day_high'] = df.groupby(['Symbol','Date'])['high'].max()
df.loc[mask, 'day_low'] = df.groupby(['Symbol','Date'])['low'].min()
< /code>
При запуске он печатает это: < /p>
                                open  high   low  close  volume                hour day_high day_low day_high_time day_low_time
Symbol               Date
SPXW 250715C06310000 2025-07-14  2.74  2.87  2.60   2.65      14 1900-01-01 08:30:00     2.87    2.25
2025-07-14  2.80  2.80  2.50   2.53      61 1900-01-01 08:31:00
2025-07-14  2.45  2.45  2.45   2.45       2 1900-01-01 08:32:00
2025-07-14  2.58  2.80  2.58   2.60      32 1900-01-01 08:33:00
2025-07-14  2.50  2.50  2.25   2.30       5 1900-01-01 08:34:00
SPXW 250709C06345000 2025-07-09  0.05  0.05  0.03   0.03     246 1900-01-01 08:30:00      0.1    0.03
2025-07-09  0.05  0.10  0.03   0.07     452 1900-01-01 08:31:00
2025-07-09  0.07  0.10  0.05   0.07     137 1900-01-01 08:32:00
2025-07-09  0.07  0.07  0.07   0.07       5 1900-01-01 08:33:00
2025-07-09  0.07  0.07  0.05   0.05     225 1900-01-01 08:34:00
SPXW 250715C06310000 2025-07-11  7.30  7.30  7.30   7.30       2 1900-01-01 08:30:00      7.3    6.41
2025-07-11  7.20  7.20  7.20   7.20       2 1900-01-01 08:31:00
2025-07-11  6.92  6.92  6.92   6.92      20 1900-01-01 08:32:00
2025-07-11  6.58  6.58  6.58   6.58       1 1900-01-01 08:34:00
2025-07-11  6.41  6.41  6.41   6.41       2 1900-01-01 08:35:00
Мой предыдущий вопрос заключался в том, как найти максимальное значение, и приложить его в столбец day_high , где час равен 8:30. Это было достигнуто этими строками кода: < /p>

Код: Выделить всё

mask = df['hour'].dt.strftime('%H:%M').eq('08:30')
df.loc[mask, 'day_high'] = df.groupby(['Symbol','Date'])['high'].max()
На основании этого ответа я также заполнил столбец 'day_low' . Я попробовал следующее: < /p>

Код: Выделить всё

hour_loc = df.groupby(['Symbol','Date'])['high'].max()
df.loc[mask, 'day_high_time'] = df.loc[df['high'] == hour_loc, 'hour']
< /code>
Когда я запускаю это, я получаю «могу только сравнивать ошибку с идентично меченной серии. Используя логику этого ответа, я попробовал следующее: < /p>
hour_loc_max = df.groupby(['Symbol','Date'])['high'].transform('max').where(mask)
hour_loc_min = df.groupby(['Symbol','Date'])['low'].transform('min').where(mask)
df.loc[mask, 'day_high_time'] = df.loc[df['high'] == hour_loc_max, 'hour']
df.loc[mask, 'day_low_time'] = df.loc[df['low'] == hour_loc_min, 'hour']
< /code>
При запуске он печатает это: < /p>
                                open  high   low  close  volume                hour day_high day_low        day_high_time day_low_time
Symbol               Date
SPXW 250715C06310000 2025-07-14  2.74  2.87  2.60   2.65      14 1900-01-01 08:30:00     2.87    2.25  1900-01-01 08:30:00          NaT
2025-07-14  2.80  2.80  2.50   2.53      61 1900-01-01 08:31:00
2025-07-14  2.45  2.45  2.45   2.45       2 1900-01-01 08:32:00
2025-07-14  2.58  2.80  2.58   2.60      32 1900-01-01 08:33:00
2025-07-14  2.50  2.50  2.25   2.30       5 1900-01-01 08:34:00
SPXW 250709C06345000 2025-07-09  0.05  0.05  0.03   0.03     246 1900-01-01 08:30:00      0.1    0.03                  NaT          NaT
2025-07-09  0.05  0.10  0.03   0.07     452 1900-01-01 08:31:00
2025-07-09  0.07  0.10  0.05   0.07     137 1900-01-01 08:32:00
2025-07-09  0.07  0.07  0.07   0.07       5 1900-01-01 08:33:00
2025-07-09  0.07  0.07  0.05   0.05     225 1900-01-01 08:34:00
SPXW 250715C06310000 2025-07-11  7.30  7.30  7.30   7.30       2 1900-01-01 08:30:00      7.3    6.41  1900-01-01 08:30:00          NaT
2025-07-11  7.20  7.20  7.20   7.20       2 1900-01-01 08:31:00
2025-07-11  6.92  6.92  6.92   6.92      20 1900-01-01 08:32:00
2025-07-11  6.58  6.58  6.58   6.58       1 1900-01-01 08:34:00
2025-07-11  6.41  6.41  6.41   6.41       2 1900-01-01 08:35:00
< /code>
Вот мои вопросы: < /p>
[list]
[*]  Почему первый метод не работает? Это сработало, когда я хотел скопировать максимальное значение с высоких/низких столбцов в Day_high/day_low 
столбцы в 8:30.

[*] Что такое Nat? Все временные значения должны быть объектами DateTime.

[/list]
tia

Подробнее здесь: https://stackoverflow.com/questions/797 ... me-row-and
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»