好的,这就是我要做的:
我有一个像这样的 DataFrame:
data = pd.DataFrame(
{'a' : [1,1,1,2,2,3,3,3],
'b' : [23,45,62,24,45,34,25,62],
})
我设法使用以下代码计算按“b”列分组的“a”列的平均值:
data.groupby('b', as_index=False)['a'].mean()
这导致了这样一个 DataFrame:
但是,我只想计算 DataFrame 中多次出现的 'b' 值的平均值,从而得到如下 Dataframe:
我尝试使用以下行来做到这一点:
data.groupby('b', as_index=False).filter(lambda group: len(group)>1)['a'].mean()
但是结果是第1、2、4、7行的均值,这显然不是我想要的。 有人可以帮我获得所需的 DataFrame 并告诉我在使用过滤器功能时我遇到了什么错误吗?
谢谢!
最佳答案
重复分组
您可以使用 data['b'].duplicated(keep=False)
来首先创建一个 bool 掩码:
>>> data[data['b'].duplicated(keep=False)].groupby('b', as_index=False)['a'].mean()
b a
0 45 1.5
1 62 2.0
data.b.duplicated(keep=False)
将所有重复的事件标记为 True 并允许您将输出限制为这些行:
>>> data.b.duplicated(keep=False)
0 False
1 True
2 True
3 False
4 True
5 False
6 False
7 True
Name: b, dtype: bool
>>> data[data.b.duplicated(keep=False)]
a b
1 1 45
2 1 62
4 2 45
7 3 62
更新:按任意出现次数分组
Can this solution be generalized to look for an arbitrary number of occurrences? Let's say I wanted to calculate the mean only for values that occurred more than 5 times on the DataFrame.
在这种情况下,您需要生成一个与上述示例形状相同的 bool 掩码,但使用的方法略有不同。
这是一种方法:
>>> vc = data['b'].map(data['b'].value_counts(sort=False))
>>> vc
0 1
1 2
2 2
3 1
4 2
5 1
6 1
7 2
Name: b, dtype: int64
这些是 b
的每个元素的元素计数。将其设置为掩码(假设您只需要 count == 2,这与本示例中的上述相同,但可以针对任何 int 进行扩展):
mask = vc == 2 # or > 5, in your case
data[mask].groupby('b', as_index=False)['a'].mean()
关于python - 将 DataFrame 过滤为重复项并计算结果的分组均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398823/