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