根据True值熊猫对行进行分组

时间:2018-09-20 08:01:12

标签: python-3.x geopandas

我有具有True和False值的Point地理数据框。 Geodataframe具有48个True / False列,每行在任何列中只有一个True,而所有其他列都为False。我想根据 foo bar 列中的True值对点进行分组,如下例所示。例如,A点和D点在 bar 列为True,因此它们组合在一起,而B点和C点在 foo 列为True,因此它们组合在一起。点几何应该保留下来,因为它们可能会在某些时候用于分析。

from shapely.geometry import Point, Polygon
import geopandas

polygons = geopandas.GeoSeries({
    'foo': Polygon([(6, 6), (7, 16), (13, 14), (13, 9)]),
    'bar': Polygon([(15, 18), (14, 15), (17, 10), (21, 9)]),
})

points = [Point(16, 13), Point(7, 8), Point(10, 12), Point(16,14)]
pnts = geopandas.GeoDataFrame(geometry=points, index=['p1', 'p2', 'p3', 'p4'])
pnts = pnts.assign(**{key: pnts.within(geom) for key, geom in 
polygons.items()})

out[]

       geometry    foo    bar
p1  POINT (16 13)  False   True
p2    POINT (7 8)   True  False
p3  POINT (10 12)   True  False
p4  POINT (16 14)  False   True

预期输出应为:

    geometry
foo POINT(7 8)
    POINT(10,12)
bar POINT (16 13)
    POINT (16 14) 

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以这样做。假设您所有的地理数据列col都在列表<a href='#' onClick={() => { onEnterSurvey(args); }} > 中。

columns

结果将如下所示。

columns = df.columns.tolist() # get all the column names in a list
columns.remove("geometry")  # make sure only those column names are present that contain 
                        # geodataframe i.e. 48 columns in your case and thats why removed column name "geometry"

df1 = pd.DataFrame(columns = ["geometry", "new_col"]) # created an empty dataframe so that we can append new rows to it

for col in columns:
    df_subset = df.loc[df[col],["geometry"]] 
    df_subset["new_col"] = col
    df1 = pd.concat([df1, df_subset])
df1.index = df1.new_col
df1.drop(["new_col"], axis = 1)

答案 1 :(得分:0)

您可能要使用pandas.where:

import pandas as pd

df = pd.DataFrame(np.random.choice([True, False], 10).reshape(-1, 2), columns=['A', 'B'])

A_result = df.where(df["A"] == True).dropna()
B_result = df.where(df["B"] == True).dropna()