Даты вызова Pandas и фреймов данных, связанные с минимальными и максимальными выходами

#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