用具有相同日期时间的所有其他行的平均值除以一行

时间:2019-06-20 10:04:01

标签: python pandas

我有这个pandas DataFrame

                              val
datetime   attribute_id          
2018-01-31 0             4.162565
           1             3.305480
           2             3.191123
           3             3.601398
           4             3.277375
           6             3.556552
2018-02-28 0             0.593762
           1             0.594565
           2             0.583355
           3             0.611113
           4             0.577600
           6             0.638904

我想有一列ratio,每个月每个属性除以所有其他属性的平均值。

例如,对于datetime = 2018-01-31(指一月),我希望列ratio包含属性0(4.162565)的值除以属性1,2,3,4和6的平均值,即3.305480、3.191123、3.601398、3.277575和3.556552的平均值。每个月按月进行。

datetimeattribute_idMultiIndex

有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

您可以使用GroupBy.transform计算每个第一个MultiIndex级别的平均值,并创建具有相同大小的新Series,例如原始DataFrame和dnen除以Series.div的列:

print (df.groupby(level=0)['val'].transform('mean'))
datetime    attribute_id
2018-01-31  0               3.515749
            1               3.515749
            2               3.515749
            3               3.515749
            4               3.515749
            6               3.515749
2018-02-28  0               0.599883
            1               0.599883
            2               0.599883
            3               0.599883
            4               0.599883
            6               0.599883
Name: val, dtype: float64

df['result'] = df['val'].div(df.groupby(level=0)['val'].transform('mean'))
print (df)
                              val    result
datetime   attribute_id                    
2018-01-31 0             4.162565  1.183977
           1             3.305480  0.940192
           2             3.191123  0.907665
           3             3.601398  1.024362
           4             3.277375  0.932198
           6             3.556552  1.011606
2018-02-28 0             0.593762  0.989796
           1             0.594565  0.991135
           2             0.583355  0.972448
           3             0.611113  1.018720
           4             0.577600  0.962854
           6             0.638904  1.065047

如果需要排除正确的行,只需在此unutbu解决方案中更改groupby(level=0)

grouped = df.groupby(level=0)
n = grouped['val'].transform('count')
mean = grouped['val'].transform('mean')
df['ratio'] = df['val'] / ((mean*n - df['val']) / (n-1))