python - Pandas :按组大小和数据值过滤

标签 python pandas

对数据进行分组后,我想从仅包含值低于特定阈值的单个观察值的结果组中删除。

初始数据:

df = pd.DataFrame(data={'Province' : ['ON','QC','BC','AL','AL','MN','ON'], 
                            'City' :['Toronto','Montreal','Vancouver','Calgary','Edmonton','Winnipeg','Windsor'],
                            'Sales' : [13,6,16,8,4,3,1]})

        City Province  Sales
0    Toronto       ON     13
1   Montreal       QC      6
2  Vancouver       BC     16
3    Calgary       AL      8
4   Edmonton       AL      4
5   Winnipeg       MN      3
6    Windsor       ON      1

现在对数据进行分组:

df.groupby(['Province', 'City']).sum()

                    Sales
Province City
AL       Calgary        8
         Edmonton       4
BC       Vancouver     16
MN       Winnipeg       3
ON       Toronto       13
         Windsor        1
QC       Montreal       6

现在我无法弄清楚的部分是如何删除只有一个城市(或通常是 N 个观测值)且总销售额小于 10 的省份。预期输出应该是:

                    Sales
Province City
AL       Calgary        8
         Edmonton       4
BC       Vancouver     16
ON       Toronto       13
         Windsor        1

即MN/Winnipeg 和 QC/Montreal 从结果中消失了。理想情况下,它们不会完全消失,而是组合成一个名为“其他”的新组,但这可能是另一个问题的 Material 。

最佳答案

你可以这样做:

In [188]: df
Out[188]:
        City Province  Sales
0    Toronto       ON     13
1   Montreal       QC      6
2  Vancouver       BC     16
3    Calgary       AL      8
4   Edmonton       AL      4
5   Winnipeg       MN      3
6    Windsor       ON      1

In [189]: g = df.groupby(['Province', 'City']).sum().reset_index()

In [190]: g
Out[190]:
  Province       City  Sales
0       AL    Calgary      8
1       AL   Edmonton      4
2       BC  Vancouver     16
3       MN   Winnipeg      3
4       ON    Toronto     13
5       ON    Windsor      1
6       QC   Montreal      6

现在我们将为那些“有多个城市的省份”创建一个掩码:

In [191]: mask = g.groupby('Province').City.transform('count') > 1

In [192]: mask
Out[192]:
0     True
1     True
2    False
3    False
4     True
5     True
6    False
dtype: bool

总销售额大于或等于10的城市获胜:

In [193]: g[(mask) | (g.Sales >= 10)]
Out[193]:
  Province       City  Sales
0       AL    Calgary      8
1       AL   Edmonton      4
2       BC  Vancouver     16
4       ON    Toronto     13
5       ON    Windsor      1

关于python - Pandas :按组大小和数据值过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095973/

相关文章:

python - 通过 Pandas 中两行的值将行转换为列

Python:记录一个类的所有方法而不装饰每个方法

python -\u0000 字符 `json.dumps` 的奇怪行为

python - Pip freeze 给我这个与 git 相关的错误

python - 更新 'username' 字段将用户注销(flask-login - MongoDB) - 类问题?

Python - pandas df 行到列标题的列表中的字符串以及计数作为值

python - 带有 Pandas 的数据库 : adding new data

python - 将装饰器与 MapReduce 映射器/缩减器函数一起使用?

regex - str.startswith 使用正则表达式

Python:如何为 Pandas DataFrame 创建带有离线绘图的阶梯图?