计算 MAD(平均绝对偏差)GroupBy Pandas
Computing MAD(mean absolute deviation) GroupBy Pandas
我有一个数据框:
Type Name Cost
A X 545
B Y 789
C Z 477
D X 640
C X 435
B Z 335
A X 850
B Y 152
我的数据框中有所有此类组合,类型为 ['A'、'B'、'C'、'D'] 和名称为 ['X'、'Y','Z']。我使用 groupby 方法一起获取特定组合的统计信息,例如 A-X 、 A-Y 、 A-Z 。这是一些代码:
df = pd.DataFrame({'Type':['A','B','C','D','C','B','A','B'] ,'Name':['X','Y','Z','X','X','Z','X','Y'], 'Cost':[545,789,477,640,435,335,850,152]})
df.groupby(['Name','Type']).agg([mean,std])
#need to use mad instead of std
我需要消除距离超过 3 MAD 的观测值;类似于:
test = df[np.abs(df.Cost-df.Cost.mean())<=(3*df.Cost.mad())]
我对此感到困惑,因为 df.Cost.mad() returns 整个数据而不是特定类型名称类别的成本的 MAD。我怎么能把两者结合起来?
您可以使用 groupby
和 transform
创建可用于过滤数据的新数据系列。
groups = df.groupby(['Name','Type'])
mad = groups['Cost'].transform(lambda x: x.mad())
dif = groups['Cost'].transform(lambda x: np.abs(x - x.mean()))
df2 = df[dif <= 3*mad]
然而,在这种情况下,没有行被过滤掉,因为差异等于平均绝对偏差(组最多只有两行)。
您可以在分组对象上获取聚合函数:
df["mad"] = df.groupby(['Name','Type'])["Cost"].transform("mad")
df = df.loc[df.mad<3]
我有一个数据框:
Type Name Cost
A X 545
B Y 789
C Z 477
D X 640
C X 435
B Z 335
A X 850
B Y 152
我的数据框中有所有此类组合,类型为 ['A'、'B'、'C'、'D'] 和名称为 ['X'、'Y','Z']。我使用 groupby 方法一起获取特定组合的统计信息,例如 A-X 、 A-Y 、 A-Z 。这是一些代码:
df = pd.DataFrame({'Type':['A','B','C','D','C','B','A','B'] ,'Name':['X','Y','Z','X','X','Z','X','Y'], 'Cost':[545,789,477,640,435,335,850,152]})
df.groupby(['Name','Type']).agg([mean,std])
#need to use mad instead of std
我需要消除距离超过 3 MAD 的观测值;类似于:
test = df[np.abs(df.Cost-df.Cost.mean())<=(3*df.Cost.mad())]
我对此感到困惑,因为 df.Cost.mad() returns 整个数据而不是特定类型名称类别的成本的 MAD。我怎么能把两者结合起来?
您可以使用 groupby
和 transform
创建可用于过滤数据的新数据系列。
groups = df.groupby(['Name','Type'])
mad = groups['Cost'].transform(lambda x: x.mad())
dif = groups['Cost'].transform(lambda x: np.abs(x - x.mean()))
df2 = df[dif <= 3*mad]
然而,在这种情况下,没有行被过滤掉,因为差异等于平均绝对偏差(组最多只有两行)。
您可以在分组对象上获取聚合函数:
df["mad"] = df.groupby(['Name','Type'])["Cost"].transform("mad")
df = df.loc[df.mad<3]