我有这个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的平均值。每个属性按月进行。datetime
和attribute_id
是MultiIndex
。有人知道该怎么做吗?
最佳答案
您可以使用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/