使用pandas绘制CSV文件各列CDF值的实现问题求助
基于pandas+seaborn绘制指定列CDF的最简实现方案
你原有代码的冗余点在于手动实现了CDF计算逻辑,且分组拼接的处理容易出现坐标轴对齐异常,可直接用以下两种方案实现,效果更稳定:
方案1:使用seaborn内置函数(最简,无需手动计算CDF)
seaborn自带的ecdfplot函数可以直接计算并绘制经验累积分布函数(和你需要的CDF效果完全一致),仅需几行代码即可完成:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 读取CSV文件 df = pd.read_csv('pathfile.csv') # 指定需要绘制的列,直接绘图 sns.ecdfplot(data=df[['1', '2', '3', '4']]) # 可选:自定义坐标轴标签 plt.xlabel('取值') plt.ylabel('累积分布概率(CDF)') plt.show()
方案2:手动计算CDF(适合需要保留CDF数据做后续分析的场景)
如果需要获取CDF的具体数值用于后续处理,可以用以下精简的pandas向量化操作实现,避免循环拼接的冗余逻辑:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.read_csv('pathfile.csv') plot_cols = ['1', '2', '3', '4'] # 宽表转长表,方便分组处理 melted_df = df[plot_cols].melt(var_name='字段名', value_name='X') # 按字段分组排序后计算CDF melted_df = melted_df.sort_values(['字段名', 'X']) melted_df['CDF'] = melted_df.groupby('字段名').cumcount() / (melted_df.groupby('字段名')['X'].transform('count') - 1) # 绘图 sns.lineplot(data=melted_df, x='X', y='CDF', hue='字段名') plt.show()
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

