按索引列分组比较它们的区域并将值添加到Python中的新列?

时间:2018-06-19 09:21:12

标签: python pandas group-by geopandas

我有这些专栏:

index, area_of_poly, cad_admin

我必须按索引分组(它是一个名为index的普通列)才能获取具有相同值的行。

#all the ones, all the twos, etc

其中一些(行)是独一无二的。 关于那些现在不是唯一的:

到目前为止我做了什么: 我必须检查group by哪个组具有最大区域,并在名为cad_admin的新列中将其受尊重的cad_admin1值提供给其组中的其他组。 唯一值仍将与现在cad_admin列中cad_admin1中的值相同。

更多信息:

数据集:http://www.mediafire.com/file/x4q5k7xuztq6o3w/p.zip

import pandas as pd
import geopandas as gpd
inte=gpd.read_file('in.shp')


inte['index'].value_counts()[inte['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




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"]])

您将看到此代码会产生一些错误,如:

TypeError: 'str' object cannot be interpreted as an integer

在处理上述异常期间,发生了另一个异常:

KeyError: ('', 'occurred at index 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

感谢任何解决这个问题的努力,因为我试图解决它2天。

1 个答案:

答案 0 :(得分:0)

inte["key1_temp"] = inte.apply(lambda row: str(row[""]) if 
row["rank_gr"] == 1.0
else "", axis = 1)

在此代码中str(行[""])提及您要操作的列