我有这些专栏:
index
,area
,key0
我必须按索引分组(它是一个名为index的普通列)才能获取具有相同值的行。
#all the ones, all the twos, etc
其中一些(行)是唯一的。
关于那些现在不是唯一的:
到目前为止我做了什么:
我必须检查group by
哪个组具有最大区域,并在名为key0
的新列中将其受尊重的key1
值提供给其组中的其他组。
唯一值仍然与现在key0
列中key1
中的值相同
首先,我检查了哪一个发生了多次,以便知道哪些将形成组。
df['index'].value_counts()[df['index'].value_counts()>1]
359 9
391 8
376 7
374 6
354 5
446 4
403 4
348 4
422 4
424 4
451 4
364 3
315 3
100 3
245 3
345 3
247 3
346 3
347 3
351 3
工作得很好。现在的事情是如何做其余的事情?
数据集:
df = pd.DataFrame({"index": [1,2,3,5,1,2,3,3,3], "area":
[50,60,70,80,90,100,10,20,70], "key0": ["1f",2,"3d",4,5,6,7,8,9]})
print df
# INPUT
area index key0
50 1 1f
60 2 2
70 3 3d
80 5 4
90 1 5
100 2 6
10 3 7
20 3 8
70 3 9
import geopandas as gpd
inte=gpd.read_file('in.shp')
inte["rank_gr"] = inte.groupby("index")["area_of_poly"].rank(ascending = False, method =
"first")
inte["key1_temp"] = inte.apply(lambda row: str(row[""]) if row["rank_gr"] == 1.0
else "", axis = 1)
inte["CAD_ADMIN_FINAL"] = inte.groupby("index")["key1_temp"].transform("sum")
print (inte[["area_of_poly", "index", "CAD_ADMIN", "CAD_ADMIN_FINAL"]])
答案 0 :(得分:0)
你的意思是这样吗?
import pandas as pd
df = pd.DataFrame({"index": [1,2,3,5,1,2,3,3,3], "area":
[50,60,70,80,90,100,10,20,70], "key0": ["1f",2,"3d",4,5,6,7,8,9]})
print df
# INPUT
area index key0
50 1 1f
60 2 2
70 3 3d
80 5 4
90 1 5
100 2 6
10 3 7
20 3 8
70 3 9
df["rank_gr"] = df.groupby("index")["area"].rank(ascending = False, method =
"first")
df["key1_temp"] = df.apply(lambda row: str(row["key0"]) if row["rank_gr"] == 1.0
else "", axis = 1)
df["key1"] = df.groupby("index")["key1_temp"].transform("sum")
print df[["area", "index", "key0", "key1"]]
# OUTPUT
area index key0 key1
50 1 1f 5
60 2 2 6
70 3 3d 3d
80 5 4 4
90 1 5 5
100 2 6 6
10 3 7 3d
20 3 8 3d
70 3 9 3d
答案 1 :(得分:0)
检查提供的数据。而且有效。尚未找到任何“ key0”列,因此假定它可以为“ CAD_ADMIN”。 “ AREA”只是一个值,所以我选择了“ AREA_2”。
import geopandas as gpd
# set your path
path = r"p\in.shp"
p = gpd.read_file(path)
p["rank_gr"] = p.groupby("index")["AREA_2"].rank(ascending = False, method =
"first")
p["key1_temp"] = p.apply(lambda row: str(row["CAD_ADMIN"]) if row["rank_gr"] == 1.0
else "", axis = 1)
p["key1"] = p.groupby("index")["key1_temp"].transform("sum")
p = p[["AREA_2", "index", "CAD_ADMIN", "key1"]]
print(p.sort_values(by = ["index"]))
AREA_2 index CAD_ADMIN key1
1.866706e+06 0 0113924 0113924
1.559865e+06 1 0113927 0113926
1.593623e+06 1 0113926 0113926
1.927774e+06 2 0113922 0113922
1.927774e+06 3 0113922 0113922