基于多个空列的行计算Groupby统计信息

2024-07-07 09:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个示例数据框,如下所示:

   df :

   ST   LW      UD  vl
   
   E1   e1   pp@yr   2
   F3   l1   pp@yr   4
   F3   l2   pp@yr   7
   E1   e3  pp2@yr   3
   F3   l4  pp3@yr  13
   E1   e5  pp3@yr   7
   F3   l6  pp3@yr   9
   E1   e7  pp2@yr   5
   E1   e8  pp3@yr   3
   F3   f9  pp4@yr   2
   F3  f11  pp4@yr   5
   F3  f13  pp5@yr   7
   F3  f7   pp5@yr   9

我想做的任务是基于列ST获取平均值和std(如果它只包含E1),并执行以下操作:

     dfD = df[df['ST'] == 'E1']

     stats_df = dfD.groupby('UD')['vl'].describe()[['mean', 'std']]


     mys = pd.DataFrame(stats_df).reset_index()

数据帧mys如下所示:

     mys


      UD       mean   std

      pp2@yr    4.0   1.414214
      pp3@yr    5.0   2.828427
      pp@yr     2.0   NaN

然后,我将数据与原始数据帧合并,如下所示:

       mdf = pd.merge(df, mys, how='left', on='UD')

生成的数据帧如下所示:

       mdf


     ST  LW  UD     vl  mean    std
     E1  e1  pp@yr   2  2.0     NaN
     F3  l1  pp@yr   4  2.0     NaN
     F3  l2  pp@yr   7  2.0     NaN
     E1  e3  pp2@yr  3  4.0    1.414214
     F3 l4   pp3@yr  13 5.0    2.828427
     E1 e5   pp3@yr  7  5.0    2.828427
     F3 l6   pp3@yr  9  5.0    2.828427
     E1 e7   pp2@yr  5  4.0    1.414214
     E1 e8   pp3@yr  3  5.0    2.828427
     F3 f9   pp4@yr  2  NaN    NaN
     F3 f11  pp4@yr  5  NaN    NaN
     F3 f13  pp5@yr  7  NaN    NaN
     F3 f7   pp5@yr  9  NaN    NaN

抱歉耽误了这么长时间。但现在我来谈谈实际的问题陈述:

问题是最后四行。问题是,每当mean和std都为Null时,我希望仅基于同时具有Null(仅基于ST=F3)和grouby(基于UD列)的行来计算mean和std。因此输出应该是这样的(注意:我计算了最后4行的平均值和统计数据)

   finaldf


     ST  LW   UD     vl mean    std

     E1  e1  pp@yr   2  2.0     NaN
     F3  l1  pp@yr   4  2.0     NaN
     F3  l2  pp@yr   7  2.0     NaN
     E1  e3  pp2@yr  3  4.0    1.414214
     F3 l4   pp3@yr  13 5.0    2.828427
     E1 e5   pp3@yr  7  5.0    2.828427
     F3 l6   pp3@yr  9  5.0    2.828427
     E1 e7   pp2@yr  5  4.0    1.414214
     E1 e8   pp3@yr  3  5.0    2.828427
     F3 f9   pp4@yr  2  3.5    1.5
     F3 f11  pp4@yr  5  3.5    1.5
     F3 f13  pp5@yr  7  8.0    1.0
     F3 f7   pp5@yr  9  8.0    1.0

我可以尝试在“mdf”数据框中循环,找出mean和std列是否都有空值,然后仅基于这些行进行分组,但计算效率不高,我正在寻找一种有效的pythonic解决方案。任何帮助都将不胜感激


Tags: 数据dfnanmeanppstdstyr
1条回答
网友
1楼 · 发布于 2024-07-07 09:15:50

如果你想过滤掉数据框中有空值的行,然后计算这些行的平均值和标准值,你可以创建一个掩码,用这个掩码过滤df,然后计算你希望在以后插入到数据框中的值

它看起来像这样:

mask = mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]
mean = mask['v1'].mean()
std = mask['v1'].std()
mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]['mean'] = mean
mdf[(mdf['mean'].isna()) & (mdf['std'].isna())]['std'] = std

注意:只需键入&;即可继续为掩码添加限制;(and)|(or),后跟括号中的条件,例如:&;(mdf['ST']='F3')

相关问题 更多 >