python - 将 DataFrame 过滤为重复项并计算结果的分组均值

标签 python pandas dataframe pandas-groupby

好的,这就是我要做的:

我有一个像这样的 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:

current DataFrame

但是,我只想计算 DataFrame 中多次出现的 'b' 值的平均值,从而得到如下 Dataframe:

Desired 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/

相关文章:

python - 如何根据另一列的值替换一列的 NaN 值?

python - 类型错误 : argument 1 must have a "write" method

android - 谷歌云消息认证错误 (401)

python - pandas中按列值触发结果

pandas - 带有日期的列进入 dask 中的日期时间索引

python - Pandas 数据框分组和求和,在组内,跨行值而不是按列

python - python中的数据帧值比较

python - 如何使用 Python 从视频创建缩略图

python - SKL学习如​​何获取 LinearSVC 分类器的决策概率

python - 如何从数据框中获取当前值来构建列表?