我有具有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)
任何人都可以帮忙吗?
答案 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()