Python中CSV多列分组及时间-距离绘图方案咨询
嘿,这两个问题我之前处理类似行驶数据时都碰到过,给你详细说下实现方法和思路:
1. 合并列并绘制时间-距离图
首先假设你的CSV是宽表格式(即同一个ID对应多组Time和Distance列,比如Time_1/Distance_1、Time_2/Distance_2...),我们可以用pandas把这些分散的列合并成单列,再绘图:
步骤代码:
首先导入需要的库:
import pandas as pd import matplotlib.pyplot as plt
读取CSV并筛选目标ID的数据:
# 替换成你的文件名 df = pd.read_csv('your_data.csv') # 替换成你要分析的目标ID target_id = 1001 # 筛选出该ID的所有行(如果每个ID只有一行,filtered_df就是单行数据) filtered_df = df[df['ID'] == target_id].reset_index(drop=True)
提取所有Time和Distance列,转成长表合并:
# 自动识别所有Time和Distance列 time_cols = [col for col in filtered_df.columns if 'Time' in col] distance_cols = [col for col in filtered_df.columns if 'Distance' in col] # 将多列Time合并为单列 time_series = filtered_df[time_cols].melt(var_name='Time_Col', value_name='Time')['Time'].dropna() # 将多列Distance合并为单列 distance_series = filtered_df[distance_cols].melt(var_name='Dist_Col', value_name='Distance')['Distance'].dropna() # 合并成最终的DataFrame(确保Time和Distance一一对应) combined_df = pd.DataFrame({'Time': time_series, 'Distance': distance_series})
绘制时间-距离图:
plt.figure(figsize=(10, 6)) plt.plot(combined_df['Time'], combined_df['Distance'], marker='o', color='#1f77b4', linewidth=2) plt.xlabel('Time Interval') plt.ylabel('Traveled Distance') plt.title(f'Time vs Distance for ID {target_id}') plt.grid(alpha=0.3) plt.show()
2. 无需合并列直接绘图的方法
当然有!如果你的Time和Distance列是一一对应的(比如Time_1对应Distance_1),可以直接遍历每一组列绘图,完全不需要合并:
实现代码:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('your_data.csv') target_id = 1001 filtered_df = df[df['ID'] == target_id].reset_index(drop=True) time_cols = [col for col in filtered_df.columns if 'Time' in col] distance_cols = [col for col in filtered_df.columns if 'Distance' in col] plt.figure(figsize=(10, 6)) # 遍历每一组Time-Distance列绘图 for t_col, d_col in zip(time_cols, distance_cols): # 取出非空数据 times = filtered_df[t_col].dropna() distances = filtered_df[d_col].dropna() plt.plot(times, distances, marker='.', label=f'{t_col} → {d_col}') plt.xlabel('Time Interval') plt.ylabel('Traveled Distance') plt.title(f'Time vs Distance for ID {target_id} (No Column Merging)') plt.legend() plt.grid(alpha=0.3) plt.show()
额外建议:
如果你的CSV其实是长表格式(即每行是一个ID的单条Time-Distance记录),那根本不需要合并列,直接筛选ID后绘图就行:
filtered_df = df[df['ID'] == target_id] filtered_df.plot(x='Time', y='Distance', marker='o', figsize=(10,6), title=f'Time vs Distance for ID {target_id}') plt.show()
这种情况下pandas的内置plot方法会直接处理,非常方便。
内容的提问来源于stack exchange,提问作者user96564
相关产品推荐
相关产品推荐

