在 geopandas 上应用多个聚合函数

Applying multiple aggregation functions over geopandas

我在对 geopandas 地理数据帧中的溶解函数应用多个聚合函数时遇到了严重困难。

虽然该操作确实有效,但生成的地理数据框列的结构为单个元组。如果是pandasmultiIndex.from_tuples结构,我的分析就没有问题。由于只是一个Tuples的序列,聚合后无法正常操作geodataframe

这是一段代码,用来表达我的观点。

给定的 GeoDataFrame 包含如下几列:

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

在我的研究案例中,我试图评估上述变量的聚合 "mean" 和 "sum"。就此而言,我使用地理数据框中的溶解功能,如下所示。


# Initial geodataframe (refered as GDF):

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

应用溶解功能后,我最终得到一个 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 的外观:

一旦这些列现在处于 Tuple 中,而不是完全采用 Multiindex 形式,我就无法在整个操作后正确过滤它们。

有谁知道像下面这样降低 GDF 的方法吗?

感谢您的宝贵时间,

此致,

菲利普·里尔

pd.MultiIndex.from_tuples 应该适用于您的列结构,问题是 non-tuple 几何列。我想有一种方法可以在手动构建多索引时包含几何列,但为了简单起见,我只是放弃了它。如果您仍然需要,只需重新附加几何列即可。

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

比 dissolve 更好的办法是先在 pandas 中使用 groupby 函数,然后 assemble pandas 数据框架到一个新的 geopandas 数据框架。这样做的好处是 您可以为不同的列指定不同的聚合方法。让我们说总和 对于 Pop 和 Mean 对于 Prep

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