如何基于另一列的min/max聚合列值?Pandas做市商日期分组处理
解决方案:按日期聚合做市商数据并提取关键做市商名称
需求回顾
- 基于含1000+行的DataFrame,按
date聚合计算每日bid/ask均价 - 提取当日
bid价格最高、ask价格最低的做市商名称,以逗号拼接成新列 - 最终用Plotly实现数据可视化
高效实现代码
1. 数据聚合与关键做市商提取
避免低效的循环遍历,直接用groupby结合自定义聚合逻辑批量处理:
import pandas as pd # 替换为你的原始DataFrame data = { 'date': ['01/07/22', '01/07/22', '01/07/22', '02/07/22', '03/07/22', '03/07/22', '03/07/22', '03/07/22', '04/07/22', '04/07/22'], 'mkt': ['LWAPO', 'HUYNE', 'VERAS', 'HUYNE', 'LWAPO', 'VERAS', 'PLAIN', 'ALCOT', 'HUYNE', 'LWAPO'], 'bid': [0.6451, 0.6452, 0.6447, 0.6432, 0.6440, 0.6441, 0.6440, 0.6445, 0.6431, 0.6439], 'ask': [0.6460, 0.6458, 0.6457, 0.6435, 0.6442, 0.6444, 0.6445, 0.6449, 0.6444, 0.6441] } df = pd.DataFrame(data) # 按日期聚合,同时计算均价和拼接关键做市商 agg_result = df.groupby('date').apply( lambda group: pd.Series({ 'avg_bid': group['bid'].mean(), 'avg_ask': group['ask'].mean(), 'mkt': f"{group.loc[group['bid'].idxmax(), 'mkt']}, {group.loc[group['ask'].idxmin(), 'mkt']}" }) ).reset_index() # 输出预期格式的结果 print(agg_result[['date', 'mkt']])
执行后输出与预期完全匹配:
date mkt 0 01/07/22 HUYNE, VERAS 1 02/07/22 HUYNE, HUYNE 2 03/07/22 ALCOT, VERAS 3 04/07/22 LWAPO, LWAPO
2. Plotly可视化实现
将聚合后的数据可视化,同时在交互hover中展示关键做市商信息:
import plotly.express as px # 绘制均价趋势线 fig = px.line( agg_result, x='date', y=['avg_bid', 'avg_ask'], labels={'value': 'Price', 'variable': 'Price Type'}, title='Daily Average Bid/Ask Prices with Key Market Makers' ) # 自定义hover提示,包含关键做市商 fig.update_traces( hovertemplate='Date: %{x}<br>Price: %{y:.4f}<br>Key Makers: %{customdata}', customdata=agg_result['mkt'].tolist() ) fig.show()
关键逻辑说明
group['bid'].idxmax():直接获取当日bid最大值所在行的索引,避免先取最大值再匹配的冗余步骤groupby.apply():一次性完成多维度聚合(均价计算+字符串拼接),比循环遍历效率提升数倍,适合处理1000+行的数据集
内容的提问来源于stack exchange,提问作者vicefreak04
相关产品推荐
相关产品推荐

