首页 > 解决方案 > 如何在 Pandas 中为多个同名行启动这个给定 DataFrame 的 for 循环?

问题描述

我需要一些帮助,我正在处理一个 .ipynb 文件来过滤数据并从该 Dataframe 中获取某些内容。

这是我正在使用的 DataFrame。 在此处输入图像描述

从这个数据框中,你可以看到有多行相同的SYMBOL.

我需要帮助来打开一个“for”循环,这将使我获得CHG_IN_OI每个符号的最高值,为该行取最高CHG_IN_OI行。

例如,如果有 14 行ACC作为符号,我需要从列中找到最高CHG_IN_OI的,并获得最高变化的那一行,并保留剩余的列!.ACCCHG_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',
    'L&TFH',
    'LICHSGFIN',
    'LT',
    'LUPIN',
    'M&M',
    'M&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()保留了剩余的列,但数据不正确。我只是想要每个符号 "HIGHEST" 的行CHG_IN_OI
提前致谢!

标签: pythonpandasdataframepandas-groupby

解决方案


尽管与问题中提供的数据不同,但我们以股权数据为例回答了相同的财务数据。

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

推荐阅读