You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于Pandas实现分组平行坐标图绘制

纽约出租车数据平行坐标图实现指南

嘿,我来帮你搞定这个平行坐标图的实现!首先得提醒你一个小细节:现在pandas已经把parallel_coordinates从pandas.tools.plotting移到pandas.plotting模块里了,用旧路径会报错哦,先把这个改过来。接下来一步步来:

1. 导入必要的库

先把需要的工具都导入进来,覆盖数据处理、归一化和绘图全流程:

import pandas as pd
from pandas.plotting import parallel_coordinates
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt

2. 特征归一化处理

你选的三个特征(行程距离、乘客数、支付金额)量纲差异极大,直接绘图会导致小范围特征的变化被掩盖,所以必须先做归一化:

# 假设你的预处理后数据存在df变量中
feature = ['trip_distance','passenger_count','payment_amount']

# 初始化归一化器,将特征缩放到0-1区间
scaler = MinMaxScaler()
df[feature] = scaler.fit_transform(df[feature])

如果不想修改原数据,也可以单独创建归一化后的数据集:

scaled_features = scaler.fit_transform(df[feature])
scaled_df = pd.DataFrame(scaled_features, columns=feature)
scaled_df['day_of_week'] = df['day_of_week']  # 预留后续分组用的周几列

3. 按周几计算日均特征值

首先得从行程时间列里提取周几信息(假设你的数据包含tpep_pickup_datetime上车时间列):

# 先把时间列转成datetime格式(如果还没处理的话)
df['tpep_pickup_datetime'] = pd.to_datetime(df['tpep_pickup_datetime'])

# 提取周几名称,方便图表可读性;也可以用数字(0=周一,6=周日)
df['day_of_week'] = df['tpep_pickup_datetime'].dt.day_name()

# 按周几分组,计算三个特征的均值
daily_mean = df.groupby('day_of_week')[feature].mean().reset_index()

4. 绘制平行坐标图

现在用parallel_coordinates生成可视化图表,重点要指定类别区分列(这里就是day_of_week):

plt.figure(figsize=(12, 6))
parallel_coordinates(
    daily_mean,
    class_column='day_of_week',  # 按周几区分不同线条
    cols=feature,  # 要展示的特征列
    color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2'],
    linewidth=2
)

# 添加图表装饰,提升可读性
plt.title('2016纽约黄出租车一周日均特征平行坐标图', fontsize=14)
plt.xlabel('特征', fontsize=12)
plt.ylabel('归一化后数值', fontsize=12)
plt.grid(alpha=0.3)
plt.legend(title='周几', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()

# 保存或展示图表
plt.savefig('parallel_coordinates.png', dpi=300)
plt.show()

实用小提示

  • 如果数据量过大,分组前可以先抽样:df_sample = df.sample(frac=0.1, random_state=42),能大幅提升运行速度
  • 不用sklearn也能实现归一化:df[feature] = df[feature].apply(lambda x: (x - x.min()) / (x.max() - x.min()))
  • 要是周几顺序混乱,可以手动排序:
    daily_mean['day_of_week'] = pd.Categorical(
        daily_mean['day_of_week'],
        categories=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
        ordered=True
    )
    

内容的提问来源于stack exchange,提问作者Min

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:29:57