Python 在单个绘图中绘制多个CDF

Python 在单个绘图中绘制多个CDF,python,pandas,matplotlib,Python,Pandas,Matplotlib,我创建了一个函数,用于计算数据帧列的CDF。它返回一个新的数据帧,其中传递了列,频率,计算了PDF,以及CDF,如下所示: import pandas as pd import numpy as np def compute_distrib(df, col): stats_df = df.groupby(col)[col].agg('count').pipe(pd.DataFrame).rename(columns = {col: 'frequency'}) # PD

我创建了一个函数,用于计算数据帧列的
CDF
。它返回一个新的数据帧,其中传递了
频率
,计算了
PDF
,以及
CDF
,如下所示:

import pandas as pd
import numpy as np

def compute_distrib(df, col):
    stats_df = df.groupby(col)[col].agg('count').pipe(pd.DataFrame).rename(columns = {col: 'frequency'})
    
    # PDF
    stats_df['pdf'] = stats_df['frequency'] / sum(stats_df['frequency'])
    
    # CDF
    stats_df['cdf'] = stats_df['pdf'].cumsum()
    stats_df = stats_df.reset_index()
    return stats_df
因此,以以下数据帧为例:

df = pd.DataFrame(np.random.randn(100,4), columns=list('ABCD'))
要计算
CDF
,我需要:

df_n = compute_distrib(df, 'B')
df_n.head()
      B     frequency   pdf     cdf
0   -2.124058   1      0.01     0.01
1   -1.949440   1      0.01     0.02
2   -1.738689   1      0.01     0.03
3   -1.733489   1      0.01     0.04
4   -1.693070   1      0.01     0.05
然后绘制
CDF

df_n.plot(x='B', y=['cdf'], grid=True)
plt.show()


但此函数允许我仅从原始
df
绘制1列的
CDF
。如何在单个绘图中绘制列
A、B、C、D的
CDF
。我认为它会更容易使用或使用。我将稍微修改您的
compute\u发行版
,因为我认为最好避免使用带有列名的x

资料
将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(np.random.randn(100,4),columns=list('ABCD'))
def计算分布(df,col):
stats_df=df.groupby(col)[col].agg('count')\
.pipe(pd.DataFrame).rename(列={col:'frequency'})
#PDF
统计数据df['pdf']=统计数据df['frequency']/sum(统计数据df['frequency'])
#CDF
stats_df['cdf']=stats_df['pdf'].cumsum()
#修改
stats\u df=stats\u df.reset\u index()\
.rename(列={col:“x”})
统计数据_df[“列”]=列
返回数据
#我计算每列的cdf
cdf=[]
对于列表中的列(“ABCD”):
附加(计算分布(df,col))
cdf=pd.concat(cdf,忽略索引=True)
plotly.express
将plotly.express导入为px
像素线(cdf,x=“x”,y=“cdf”,color=“col”)

seaborn
导入seaborn作为sns
sns.线形图(x=cdf[“x”],
y=cdf[“cdf”],
色调=cdf[“颜色]);

额外示例 我不确定是否是这种情况,但有一种方法可以只绘制
cdf
,而不事先计算它

seaborn
导入seaborn作为sns
df1=pd.melt(df,var_name=“col”,value_name=“x”)
kwargs={'cumulative':True}
对于df1.groupby(“col”)中的grp:
label=grp[0]
grp=grp[1]
kwargs[“标签”]=标签
sns.distplot(grp[“x”],hist=False,kde_kws=kwargs)

在这里,我并不是提供一个唯一的解决方案。我认为它会更容易使用或使用。我将稍微修改您的
compute\u发行版
,因为我认为最好避免使用带有列名的x

资料
将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(np.random.randn(100,4),columns=list('ABCD'))
def计算分布(df,col):
stats_df=df.groupby(col)[col].agg('count')\
.pipe(pd.DataFrame).rename(列={col:'frequency'})
#PDF
统计数据df['pdf']=统计数据df['frequency']/sum(统计数据df['frequency'])
#CDF
stats_df['cdf']=stats_df['pdf'].cumsum()
#修改
stats\u df=stats\u df.reset\u index()\
.rename(列={col:“x”})
统计数据_df[“列”]=列
返回数据
#我计算每列的cdf
cdf=[]
对于列表中的列(“ABCD”):
附加(计算分布(df,col))
cdf=pd.concat(cdf,忽略索引=True)
plotly.express
将plotly.express导入为px
像素线(cdf,x=“x”,y=“cdf”,color=“col”)

seaborn
导入seaborn作为sns
sns.线形图(x=cdf[“x”],
y=cdf[“cdf”],
色调=cdf[“颜色]);

额外示例 我不确定是否是这种情况,但有一种方法可以只绘制
cdf
,而不事先计算它

seaborn
导入seaborn作为sns
df1=pd.melt(df,var_name=“col”,value_name=“x”)
kwargs={'cumulative':True}
对于df1.groupby(“col”)中的grp:
label=grp[0]
grp=grp[1]
kwargs[“标签”]=标签
sns.distplot(grp[“x”],hist=False,kde_kws=kwargs)

你真的不需要
plt.show()
你真的不需要
plt.show()
太棒了,你让我开心了。我刚刚添加了一个示例。很有趣,所以不需要编写自定义函数。是的。我建议您探索
seaborn
。它提供了许多内置的解决方案。我的错。现在已经修好了。太棒了,你让我开心了。我刚刚添加了一个示例。很有趣,所以不需要编写自定义函数。是的。我建议您探索
seaborn
。它提供了许多内置的解决方案。我的错。现在修好了。