在大熊猫上应用多种聚合功能

时间:2019-05-10 20:10:51

标签: python-3.x aggregation geopandas

在geopandas地理数据框中,在将多个聚合函数应用于dissolve函数时,我面临着严重的困难。

尽管该操作确实起作用,但是生成的地理数据框列被结构化为单个元组。如果它以pandas multiIndex.from_tuples结构构建,则我的分析不会有问题。由于它只是一个元组序列,因此聚合操作后,我无法正确操作地理数据框。

这是一个简短的代码,以便介绍我的观点。

给定的GeoDataFrame包含几列,如下所示:

['GEOCODE_4', 'Datetime', 'geometry', 'Precipitacao_1000m', 'COD_UF','COD_MUNIC', 'POP', 'POP_Esperada', 'HAV', 'Incidencia','Incidencia_10_3e', 'Year']

在我的研究案例中,我试图评估上述那些变量的总“均值”和“总和”。为此,我使用地理数据框中的dissolve函数,如下所示。


# Initial geodataframe (refered as GDF):

GDF_temporal_reduced = GDF.dissolve(by='GEOCODE_4', aggfunc=['sum', 'mean'])

在应用了dissolve函数之后,我得到了一个Geodataframe,其列的结构为元组:


# GDF_temporal_reduced.columns 

    # returns the following index:

['geometry',  
('Precipitacao_1000m', 'sum'),     ('Precipitacao_1000m', 'mean'),
('COD_UF', 'sum'),                 ('COD_UF', 'mean'),
('COD_MUNIC', 'sum'),              ('COD_MUNIC', 'mean'),
('POP', 'sum'),                    ('POP', 'mean'),
('POP_Esperada', 'sum'),           ('POP_Esperada', 'mean'),  
('HAV', 'sum'),                    ('HAV', 'mean'),
('Incidencia', 'sum'),             ('Incidencia', 'mean'),
('Incidencia_10_3e', 'sum'),       ('Incidencia_10_3e', 'mean'),
('Year', 'sum'),                   ('Year', 'mean')] 

这是我的GDF外观:

GDF after reduction

一旦这些列现在位于Tuple中,而不是精确地以Multiindex形式出现,在整个操作之后,我将无法正确过滤它们。

有人知道一种降低GDF的方法吗?

Desired reduced GDF

感谢您的宝贵时间,

真诚的,

Philipe Leal

2 个答案:

答案 0 :(得分:1)

pd.MultiIndex.from_tuples应该与您的列结构一起使用,问题是非元组几何列。我猜有一种在手动构建多索引时包括几何列的方法,但是为了简单起见,我只是删除了它。如果仍然需要,只需重新附加几何列。

df = df.drop('geometry', axis=1)
df.columns = pd.MultiIndex.from_tuples(df.columns)
df = df.swaplevel(axis=1)

答案 1 :(得分:-1)

比dissolve更好的方法是先在pandas中使用groupby函数,然后组装pandas 数据框架转换为新的 geopandas 数据框架。这样做的好处是 您可以为不同的列指定不同的聚合方法。让我们说总和 流行和平均准备

GDF_merged = gpd.GeoDataFrame(GDF.groupby('GEOCODE_4').agg({'geometry':'first', 
                                                           'Pop': "sum", 
                                                           'Prep':'mean' }).reset_index(),
                                                           geometry="geometry",
                                                           crs = GDF.crs
                              )