pandas定位选取某列某指标最大值所在的行记录,比如月底

比如对于一个股价时间序列表:

年月      年月日 股价
贵州茅台 202301 20230101 1500
贵州茅台 202301 20230120 1600
贵州茅台 202301 20230131 1400
贵州茅台 202302 20230205 1300
贵州茅台 202302 20230228 1700
五粮液 202301 20230102 1000
五粮液 202301 20230131 2000

怎样筛选出每个股票在月底那天的股价?

两种方法:

1) 先制定好一个每年每月最后一个交易日的表,然后查表

2)数据分析方法,先按股票和年月分组,然后再定位选取每个月里面日期最大的那一行。

下面是第二种方法的代码:

import pandas as pd  
  
# 假设你的数据框为df,ym是年月,ymd是年月日,code是股票代码,sc是股价  
df = pd.DataFrame({'ym': ['202301', '202301','202301','202302','202302', '202301', '202301'],
                   'code':['贵州茅台','贵州茅台','贵州茅台','贵州茅台','贵州茅台','五粮液','五粮液'],
                   'ymd': ['20230101', '20230120', '20230131', '20230205','20230228','20230102','20230131'],
                  "sc":[1500,1600,1400,1300,1700,1000,2000]})  
df['ymd'] = pd.to_datetime(df['ymd'])

print(df) 

# 假设您的数据框名为df,包含年月(ym)、年月日(ymd)和得分(sc)列
# 首先按年月分组
grouped = df.groupby(['code','ym'])

# 在每个组里面选取年月日最大的那一行记录
#两种方法:
# 1)
#result = grouped.apply(lambda x: x[x['ymd'] == x['ymd'].max()])
#2)
max_date_rows = grouped['ymd'].idxmax()
result = df.loc[max_date_rows]


# 重置索引
result.reset_index(drop=True, inplace=True)

print(result)

 运行结果:

       年月    代码        年月日          股价
0  202301  贵州茅台 2023-01-01  1500
1  202301  贵州茅台 2023-01-20  1600
2  202301  贵州茅台 2023-01-31  1400
3  202302  贵州茅台 2023-02-05  1300
4  202302  贵州茅台 2023-02-28  1700
5  202301  五粮液    2023-01-02   1000
6  202301  五粮液    2023-01-31   2000
       年月    代码        年月日          股价
0  202301  五粮液     2023-01-31  2000
1  202301  贵州茅台 2023-01-31  1400
2  202302  贵州茅台 2023-02-28  1700

你可能感兴趣的:(统计,数据挖掘,投资,pandas)