python - 使用 groupby 的结果过滤 pandas 数据框

标签 python python-2.7 pandas dataframe filter

我有一个大数据框(4000 万行),如果值满足 groupby 对象中的条件,我想根据一列过滤掉行。

例如,这里是一些随机数据。 “字母”列实际上有数千个唯一值:

     x   y   z  letter
0   47  86  30  e
1   58   9  28  b
2   96  59  42  a
3   79   6  45  e
4   77  80  37  d
5   66  91  35  d
6   96  31  52  d
7   56   8  26  e
8   78  96  14  a
9   22  60  13  e
10  75  82   9  d
11   5  54  29  c
12  83  31  40  e
13  37  70   2  c
14  53  67  66  a
15  76  33  78  d
16  64  67  81  b
17  23  94   1  d
18  10   1  31  e
19  52  11   3  d

在 'letter' 列上应用 groupby,并为每个字母获取 x 列的总和:

df.groupby('letter').x.sum()
>>> a    227
    b    122
    c     42
    d    465
    e    297

然后,我对总和最高的字母进行排序,并手动确定一个阈值。在此示例中,阈值可能是 200。

df.groupby('letter').x.sum().reset_index().sort_values('x', ascending=False)
>>> letter    x
3      d  465
4      e  297
0      a  227
1      b  122
2      c   42

这是我卡住的地方。在原始数据框中,如果列 'x' 的 groupby 总和 > 200,我想保留字母,并删除其他行。所以在这个例子中,它将保留所有带有 d、e 或 a 的行。

我正在尝试类似的方法,但它不起作用:

df.groupby('letter').x.sum().filter(lambda x: len(x) > 200)

即使我过滤了 groupby 对象,我如何使用它来过滤原始数据框?

最佳答案

您可以使用 groupby transform 计算每一行的 x 总和,并创建一个逻辑序列,您可以使用该条件执行子集:

df1 = df[df.x.groupby(df.letter).transform('sum') > 200]

df1.letter.unique()
# array(['e', 'a', 'd'], dtype=object)

或者使用 groupby.filter 的另一个选项:

df2 = df.groupby('letter').filter(lambda g: g.x.sum() > 200)

df2.letter.unique()
# array(['e', 'a', 'd'], dtype=object)

关于python - 使用 groupby 的结果过滤 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948698/

相关文章:

python - 将相邻行附加到 Pandas 中的选定行

python - dataframe.group 通过改变空数据框的数据类型

python - 如何计算 Pandas 系列中重复出现的相同值

Python元组,到底是什么意思

python - 绘制具有 8 个特征的 k-最近邻图?

python - 使用Python Requests模块登录网站

python-2.7 - pip 安装路径库

Python 类对象错误

python - Django - 管理模型中的多重多元化

python - 使用 pandas 将索引列添加到 DataFrame