【问题标题】:How to sum a column within a subset of a pandas dataframe如何对熊猫数据框的子集中的列求和
【发布时间】:2019-03-12 07:51:49
【问题描述】:

我对 Python 及其在 GIS 中的应用非常陌生。

使用 Jupyter 笔记本,我正在处理一个太大而无法用 excel 打开的数据集。它有近 800000 行和 61 列。

现在,我需要查询数据框以创建感兴趣的子集,在本例中为 2 列:OBJECTID 和 Landuse,每列都有一个特定范围:

import pandas
df = pd.read_csv('.big file.csv')
grass_ID4440 = df[(df.OBJECTID == 4440) & (df.Landuse == 'Grass - Urban')]

这个子集有 38 行。现在,如果我只想对这 38 行的面积求和,我应该采用哪种逻辑/方法?

这是我的想法:

area_ID4440 = grass_ID4440['Area'].sum()

这在逻辑上显然是错误的,因为它吐出了整个数据集的总面积之和。

提前谢谢你!

【问题讨论】:

  • 据我所知,grass_ID4440 只包含所需的 38 行,因此使用 grass_ID4440['Area'].sum() 只能对这些区域求和。
  • 请显示所需的输出,因为单个总和似乎可以回答 我想对这 38 行的面积求和

标签: python python-3.x pandas indexing


【解决方案1】:

你的逻辑应该工作正常。但值得指出的是,您应该尽可能避免在文档中使用链式索引explicitly discouraged。这消除了使用副本与视图的歧义,但也使您的逻辑更清晰。

有几个选项:-

重用布尔索引

一种常用的方法是计算一个布尔掩码(昂贵的部分)并在后续计算中重复使用:

mask = (df['OBJECTID'] == 4440) & (df['Landuse'] == 'Grass - Urban')
grass_ID4440 = df[mask]  # this is a view based on df
area_ID4440 = df.loc[mask, 'Area'].sum()  # scalar output

制作显式副本

这样,对数据框切片的任何更改都不会影响您的原始数据框:

mask = (df['OBJECTID'] == 4440) & (df['Landuse'] == 'Grass - Urban')
grass_ID4440 = df[mask].copy()  # this is a copy, changes will not be reflected in df
area_ID4440 = df.loc[mask, 'Area'].sum()  # scalar output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多