Как запустить цикл for для этого заданного фрейма данных в Pandas для нескольких строк с одинаковыми именами?

#python #pandas #dataframe #pandas-groupby

#python #pandas #фрейм данных #pandas-groupby

Вопрос:

Мне нужна некоторая помощь, я работаю над файлом .ipynb для фильтрации данных и получения определенных данных из этого фрейма данных.

С этим фреймом данных я работаю. введите описание изображения здесь

Как вы можете видеть, в этом фрейме данных есть несколько одинаковых строк SYMBOL .

Мне нужна помощь, чтобы открыть цикл «for», который даст мне наибольшее значение CHG_IN_OI для каждого символа, возьмите строку с самым высоким значением CHG_IN_OI для этой строки.

Например, если в качестве символа имеется 14 строк ACC , мне нужно найти наибольшее значение CHG_IN_OI for ACC из CHG_IN_OI столбца и получить эту строку с наибольшим изменением, также сохранив остальные столбцы!.

Я создал список с именем Multisymbols, который содержит эти символы:

    multisymbols = [
    'ACC',
    'ADANIENT',
    'ADANIPORTS',
    'AMARAJABAT',
    'AMBUJACEM',
    'APOLLOHOSP',
    'APOLLOTYRE',
    'ASHOKLEY',
    'ASIANPAINT',
    'AUROPHARMA',
    'AXISBANK',
    'BAJAJ-AUTO',
    'BAJAJFINSV',
    'BAJFINANCE',
    'BALKRISIND',
    'BANDHANBNK',
    'BANKBARODA',
    'BATAINDIA',
    'BEL',
    'BERGEPAINT',
    'BHARATFORG',
    'BHARTIARTL',
    'BHEL',
    'BIOCON',
    'BOSCHLTD',
    'BPCL',
    'BRITANNIA',
    'CADILAHC',
    'CANBK',
    'CENTURYTEX',
    'CHOLAFIN',
    'CIPLA',
    'COALINDIA',
    'COLPAL',
    'CONCOR',
    'CUMMINSIND',
    'DABUR',
    'DIVISLAB',
    'DLF',
    'DRREDDY',
    'EICHERMOT',
    'EQUITAS',
    'ESCORTS',
    'EXIDEIND',
    'FEDERALBNK',
    'GAIL',
    'GLENMARK',
    'GMRINFRA',
    'GODREJCP',
    'GODREJPROP',
    'GRASIM',
    'HAVELLS',
    'HCLTECH',
    'HDFC',
    'HDFCBANK',
    'HDFCLIFE',
    'HEROMOTOCO',
    'HINDALCO',
    'HINDPETRO',
    'HINDUNILVR',
    'IBULHSGFIN',
    'ICICIBANK',
    'ICICIPRULI',
    'IDEA',
    'IDFCFIRSTB',
    'IGL',
    'INDIGO',
    'INDUSINDBK',
    'INFRATEL',
    'INFY',
    'IOC',
    'ITC',
    'JINDALSTEL',
    'JSWSTEEL',
    'JUBLFOOD',
    'KOTAKBANK',
    'Lamp;TFH',
    'LICHSGFIN',
    'LT',
    'LUPIN',
    'Mamp;M',
    'Mamp;MFIN',
    'MANAPPURAM',
    'MARICO',
    'MARUTI',
    'MCDOWELL-N',
    'MFSL',
    'MGL',
    'MINDTREE',
    'MOTHERSUMI',
    'MRF',
    'MUTHOOTFIN',
    'NATIONALUM',
    'NAUKRI',
    'NESTLEIND',
    'NIITTECH',
    'NMDC',
    'NTPC',
    'ONGC',
    'PAGEIND',
    'PEL',
    'PETRONET',
    'PFC',
    'PIDILITIND',
    'PNB',
    'POWERGRID',
    'PVR',
    'RAMCOCEM',
    'RBLBANK',
    'RECLTD',
    'RELIANCE',
    'SAIL',
    'SBILIFE',
    'SBIN',
    'SHREECEM',
    'SEIMENS',
    'SRF',
    'SRTRANSFIN',
    'SUNPHARMA',
    'SUNTV',
    'TATACHEM',
    'TATACONSUM',
    'TATAMOTORS',
    'TATAPOWER',
    'TATASTEEL',
    'TCS',
    'TECHM',
    'TITAN',
    'TORNTPHARM',
    'TORNTPOWER',
    'TVSMOTOR',
    'UBL',
    'UJJIVAN',
    'ULTRACEMCO',
    'UPL',
    'VEDL',
    'VOLTAS',
    'WIPRO',
    'ZEEL' 
    ]
df = df[df['SYMBOL'].isin(multisymbols)]
df
  

Это все общие ресурсы в NSE. Надеюсь, вы сможете понять и помочь мне. Я использовал .groupby() , он успешно выдал мне наибольшее значение CHG_IN_OI и .agg() для сохранения оставшихся столбцов, но данные были неверными. Я просто хочу, чтобы строка для каждого символа была «САМОЙ ВЫСОКОЙ» CHG_IN_OI .
Заранее спасибо!

Комментарии:

1. Когда вы говорите «данные были неверными», пожалуйста, опубликуйте полученные вами результаты и результаты, которые вы ожидали, и объясните, почему это неверно.

Ответ №1:

Хотя данные отличаются от представленных в вопросе, мы ответили на те же финансовые данные, используя в качестве примера данные о собственном капитале.

 import pandas as pd
import pandas_datareader.data as web
import datetime

with open('./alpha_vantage_api_key.txt') as f:
    api_key = f.read()

start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2020, 8,1)

df_all = pd.DataFrame()
symbol = ['AAPL','TSLA']
for i in symbol:
    df = web.DataReader(i, 'av-daily', start, end, api_key=api_key)
    df['symbol'] = i
    df_all = pd.concat([df_all, df], axis=0)

df.index = pd.to_datetime(df.index)
  

Агрегирование одного столбца

 df_all.groupby('symbol')['volume'].agg('max').reset_index()
    symbol  volume
0   AAPL    106721200
1   TSLA    60938758
  

Агрегация по нескольким столбцам

 df_all.groupby('symbol')[['high','volume']].agg(high=('high','max'), volume=('volume','max'))
    high    volume
symbol      
AAPL    425.66  106721200
TSLA    1794.99 60938758
  

Извлеките целевую строку

 symbol_max = df_all.groupby('symbol').apply(lambda x: x.loc[x['volume'].idxmax()]).reset_index(drop=True)
symbol_max
    open    high    low close   volume  symbol
0   257.26  278.4100    256.37  273.36  106721200   AAPL
1   882.96  968.9899    833.88  887.06  60938758    TSLA