#python #pandas #dataframe
#питон #pandas #фрейм данных #python
Вопрос:
Я загрузил файл xlsx в python с этим в качестве вывода:
Stock Date Open High Low Close Volume
0 FMG 2019-01-31 34.88 35.14 34.83 34.83 15402087
1 BHP 2019-01-30 34.54 35.40 34.30 34.60 11832431
2 ANZ 2019-01-29 33.50 33.79 33.49 33.74 7772463
3 FMG 2019-01-25 32.72 33.12 32.72 33.05 7876508
4 BHP 2019-01-24 32.53 32.78 32.45 32.62 6055049
5 ANZ 2019-01-23 32.50 32.63 32.24 32.63 5777639
6 ANZ 2019-01-22 33.04 33.13 32.76 32.77 5752232
7 BHP 2019-01-21 33.25 33.40 33.20 33.20 8036600
8 FMG 2019-01-18 33.11 33.30 33.07 33.11 9143363
9 BHP 2019-01-17 32.90 33.04 32.77 32.87 5247991
10 FMG 2019-01-16 32.90 32.93 32.71 32.93 10734470
11 BHP 2019-01-15 32.70 33.07 32.60 33.06 5865704
12 BHP 2019-01-14 32.70 32.97 32.62 32.71 8067488
13 BHP 2019-01-11 32.95 33.01 32.67 32.79 6063635
Я хочу написать некоторый код, который вернет значения .max() (для столбца ‘High’) для каждого из BHP, ANZ и FMG и вернет данные, с которыми это произошло.
df = df.groupby('Stock').agg({'High':'max', 'Low':'min'})[['High','Low']].reset_index()
print (df)
возвращает это:
Stock High Low
0 ANZ 26.31 23.81
1 BHP 35.40 32.24
2 FMG 5.65 4.13
Это здорово, но как бы я получил соответствующие даты, связанные как с максимумами, так и с минимумами каждой из акций, когда это произошло.
Я довольно новичок и поиграл с функциональностью фреймов данных, но получить это в качестве выходных данных было довольно сложно.
Ответ №1:
Проверьте с помощью двух groupby
и idxmax
idxmin
, обратите внимание, что минимальная дата не будет совпадать с максимальной датой
maxid = df.groupby('Stock').High.idxmax()
minid = df.groupby('Stock').Low.idxmin()
s = df.loc[maxid,['Stock','Date', 'High']].merge(df.loc[minid,['Stock','Date', 'Low']], on='Stock')
s
Out[166]:
Stock Date_x High Date_y Low
0 ANZ 2019-01-29 33.79 2019-01-23 32.24
1 BHP 2019-01-30 35.40 2019-01-24 32.45
2 FMG 2019-01-31 35.14 2019-01-16 32.71