根据条件对数据帧行进行分组和平均

米洛什德拉戈

我有以下数据框:

Company_ID  Year   Metric_1  Metric_2  Bankrupt
1           2010   10        20        0.0
1           2011   NaN       30        0.0
1           2012   30        40        0.0
1           2013   50        NaN       1.0
2           2012   50        60        0.0
2           2013   60        NaN       0.0
2           2014   10        10        0.0
3           2011   100       100       1.0

我想为每个公司做除去年以外的所有年份的所有指标的平均值。它仅应取当前值的平均值,而忽略缺失值(NaN)。同样,它不应该平均破产列。

因此输出应如下所示:

Company_ID  Year        Metric_1  Metric_2  Bankrupt
1           2010-2012   20        30        0.0
1           2013        50        Nan       1.0
2           2012-2013   55        60        0.0
2           2014        10        10        0.0
3           2011        100       100       1.0

感谢您的帮助。

我想要一片T骨牛排

这种方式类似于@Stef的方法,但是我保留了这一方式,因为它适用于任意数量的Metric列(只要它们的名称以Metric开头)。如果最终使用此解决方案,请改为接受他们的解决方案。

你可以这样

#mask for catching last year per Company
m = df.groupby(['Company_ID'])['Year'].transform('max').eq(df['Year'])
# create groups per company without the last year
gr = df[~m].groupby(df['Company_ID'], as_index=False)

df_ = (pd.concat([gr.agg(Company_ID=('Company_ID', 'first'), #perform agg depending on needs
                         Bankrupt=('Bankrupt', 'first'), #here I'm not sure with value you want
                         Year=('Year', lambda x: f'{x.min()}-{x.max()}')), 
                  gr[df.filter(like='Metric').columns].mean()], 
                 axis=1)
         .append(df[m]) # append last year
         .sort_values(['Company_ID'])
         .reset_index(drop=True)
      )
print (df_)   
   Company_ID  Bankrupt       Year  Metric_1  Metric_2
0           1       0.0  2010-2012      20.0      30.0
1           1       1.0       2013      50.0       NaN
2           2       0.0  2012-2013      55.0      60.0
3           2       0.0       2014      10.0      10.0
4           3       1.0       2011     100.0     100.0

避免使用append和sort_values的另一个版本,可以对Year列使用不同的lambda函数来实现

#mask for catching last year per Company
m = df.groupby(['Company_ID'])['Year'].transform('max').eq(df['Year']) #same
# create groups per company without the last year
gr = df.groupby([df['Company_ID'], m]) #m is in the groupby and not as mask

df_ = (pd.concat([gr.agg(Company_ID=('Company_ID', 'first'), 
                        Bankrupt=('Bankrupt', 'first'),
                        Year=('Year', lambda x: f'{x.min()}-{x.max()}' if x.min()!=x.max()
                                                else x.max())), #different lambda function
                  gr[df.filter(like='Metric').columns].mean()], 
                 axis=1)
         #no more append/sort_values
         .reset_index(drop=True)
      )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据条件并排除最后一行来对数据帧行进行分组和平均

根据向量以特定顺序对数据帧行进行排序

根据索引值对数据帧进行分组

根据数据帧中的条件进行分组的列

如何根据条件对数据进行分组?

根据条件对行进行分组和分组

根据因素对数据帧行进行混洗

根据列中的序列中断对数据帧进行分组?

根据R中的某些条件对数据帧进行子集

对数据框行进行分组并对其进行处理

根据某些行名称对数据框中的行进行分组和转置

根据另一列对数据帧进行分组/汇总和求和

根据用户在运行时和时间间隔输入的字段对数据帧进行分组

有条件地对数据帧的每一行进行计数

根据另一列的冗余对数据帧列的数据进行平均

如何对数据帧行进行分组并针对字符串列表中的所有匹配项进行过滤?

在R中:根据另一个表中的数据对数据帧中的行进行重新排序

如何根据用户指定的条件对数据帧进行子集

根据时间戳对数据帧的行进行排序

在R中对数据帧进行分组

根据条件对行进行分组

在 R 中,如何根据向量中的值对数据帧的行进行子集

根据日期列对数据框中的行进行分组

数据框根据条件对行进行分组

如何对数据帧的行进行采样/分组以修复组内的特定分布?

根据值对数据集行进行分组

根据列对数据框中的多行进行分组

基于使用 R 的条件对数据帧中的行进行洗牌

R:如何按二进制类别对数据帧行进行分组?