我有这个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

有人知道该怎么做吗?

最佳答案

您可以使用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))

关于python - 用具有相同日期时间的所有其他行的平均值除以一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56683577/

10-11 03:08