如何对熊猫数据框的子集中的列求和

时间:2018-10-07 13:03:57

标签: python python-3.x pandas indexing

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

使用Jupyter笔记本,我处理的数据集太大而无法用excel打开。它具有近80万行和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()

从逻辑上讲,这显然是错误的,因为它会花掉整个数据集的TOTAL面积之和。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您的逻辑应该工作正常。但值得指出的是,应尽可能在文档中{em>避免链式索引,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