通过对两列进行分组来求均值
find mean by grouping two columns
我有一个看起来像这样的数据集:
Value Type mean
-1.975767 Weather
-0.540979 Fruits
-2.359127 Fruits
-2.815604 Corona
-0.929755 Weather
我想遍历每一行并计算上面每一行的平均值(仅当 Type 匹配时)。均值计算公式:
所有值的总和/观测值数
其中观察次数将是到目前为止某个类型出现的次数。
例如,在第一行中,上面没有“天气”行,因此天气 n = 1。所以平均值为 -1.975767 / 1 = -1.975767。
在第二行中,其上方没有 FRUITS 行,因此平均值将为 -0.540979/1 = -0.540979。
然而,在第三行中,当我们扫描所有前面的行时,我们看到 FRUITS 已经在此之前发生,因此,对于 Fruits,n = 2。所以我们应该得到最后一个 FRUIT 的值并计算一个新的平均值。所以在这里,平均值将是 -0.540979 + (-2.359127) 除以 2。
Value Type mean
-1.975767 Weather -1.975767
-0.540979 Fruits -0.540979
-2.359127 Fruits (-0.540979 -2.359127) / 2
-2.815604 Corona -2.815604
-0.929755 Weather (-1.975767 -0.929755) / 2
我用它来实现这个并且效果很好:
df['mean'] = df.groupby('type', as_index=False)['value'].expanding().mean().sort_index(level=1).droplevel(0)
但是,现在我想根据两个列的分组做同样的事情,这样国家和类型都匹配。
Value Type mean Country
-1.975767 Weather Albania
-0.540979 Fruits Brazil --should be grouped
-2.359127 Fruits Brazil --should be grouped
-2.815604 Corona Albania
-0.929755 Weather China
我试过这个:
df['mean'] = df.groupby([df.type,df.country], as_index=False)['value'].expanding().mean().sort_index(level=1).droplevel(0)
但是,这给了我一个错误:
TypeError: incompatible index of inserted column with frame index
尽管它几乎是一回事。我做错了什么?
尝试:
df["Mean"] = df.groupby(["Type", "Country"])["Value"].expanding().mean().droplevel([0,1]).sort_index()
>>> df
Value Type Country Mean
0 -1.975767 Weather Albania -1.975767
1 -0.540979 Fruits Brazil -0.540979
2 -2.359127 Fruits Brazil -1.450053
3 -2.815604 Corona Albania -2.815604
4 -0.929755 Weather China -0.929755
输入 df:
df = pd.DataFrame({"Value": [-1.975767, -0.540979, -2.359127, -2.815604, -0.929755],
"Type": ["Weather", "Fruits", "Fruits", "Corona", "Weather"],
"Country": ["Albania", "Brazil", "Brazil", "Albania", "China"]})
我有一个看起来像这样的数据集:
Value Type mean
-1.975767 Weather
-0.540979 Fruits
-2.359127 Fruits
-2.815604 Corona
-0.929755 Weather
我想遍历每一行并计算上面每一行的平均值(仅当 Type 匹配时)。均值计算公式:
所有值的总和/观测值数
其中观察次数将是到目前为止某个类型出现的次数。
例如,在第一行中,上面没有“天气”行,因此天气 n = 1。所以平均值为 -1.975767 / 1 = -1.975767。
在第二行中,其上方没有 FRUITS 行,因此平均值将为 -0.540979/1 = -0.540979。
然而,在第三行中,当我们扫描所有前面的行时,我们看到 FRUITS 已经在此之前发生,因此,对于 Fruits,n = 2。所以我们应该得到最后一个 FRUIT 的值并计算一个新的平均值。所以在这里,平均值将是 -0.540979 + (-2.359127) 除以 2。
Value Type mean
-1.975767 Weather -1.975767
-0.540979 Fruits -0.540979
-2.359127 Fruits (-0.540979 -2.359127) / 2
-2.815604 Corona -2.815604
-0.929755 Weather (-1.975767 -0.929755) / 2
我用它来实现这个并且效果很好:
df['mean'] = df.groupby('type', as_index=False)['value'].expanding().mean().sort_index(level=1).droplevel(0)
但是,现在我想根据两个列的分组做同样的事情,这样国家和类型都匹配。
Value Type mean Country
-1.975767 Weather Albania
-0.540979 Fruits Brazil --should be grouped
-2.359127 Fruits Brazil --should be grouped
-2.815604 Corona Albania
-0.929755 Weather China
我试过这个:
df['mean'] = df.groupby([df.type,df.country], as_index=False)['value'].expanding().mean().sort_index(level=1).droplevel(0)
但是,这给了我一个错误:
TypeError: incompatible index of inserted column with frame index
尽管它几乎是一回事。我做错了什么?
尝试:
df["Mean"] = df.groupby(["Type", "Country"])["Value"].expanding().mean().droplevel([0,1]).sort_index()
>>> df
Value Type Country Mean
0 -1.975767 Weather Albania -1.975767
1 -0.540979 Fruits Brazil -0.540979
2 -2.359127 Fruits Brazil -1.450053
3 -2.815604 Corona Albania -2.815604
4 -0.929755 Weather China -0.929755
输入 df:
df = pd.DataFrame({"Value": [-1.975767, -0.540979, -2.359127, -2.815604, -0.929755],
"Type": ["Weather", "Fruits", "Fruits", "Corona", "Weather"],
"Country": ["Albania", "Brazil", "Brazil", "Albania", "China"]})