按一列分组比较另一列并在Python中向新列添加值?

按一列分组比较另一列并在Python中向新列添加值?,python,pandas,group-by,Python,Pandas,Group By,我有以下专栏: 索引,区域,key0 我必须按索引分组(这是一个称为index的普通列),以便获取具有相同值的行 #all the ones, all the twos, etc 但其中一些(行)是唯一的 关于那些现在不是唯一的: 到目前为止我所做的: 我必须通过一个名为key1的新列检查group by哪些组的面积最大,并将其受尊重的key0值提供给组中的其他组 唯一值仍将与nowkey1列中的key0中的值相同 首先,我检查了其中的哪些会发生多次,以便知道哪些会形成组 df['index'

我有以下专栏:
索引
区域
key0

我必须按索引分组(这是一个称为index的普通列),以便获取具有相同值的行

#all the ones, all the twos, etc
但其中一些(行)是唯一的

关于那些现在不是唯一的:

到目前为止我所做的:

我必须通过一个名为
key1
的新列检查
group by
哪些组的面积最大,并将其受尊重的
key0
值提供给组中的其他组

唯一值仍将与now
key1
列中的
key0
中的值相同

首先,我检查了其中的哪些会发生多次,以便知道哪些会形成组

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 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

检查您提供的数据。它是有效的。未找到任何“key0”列,因此假定它可以是“CAD_ADMIN”。“AREA”只有一个值,所以我取了“AREA_2”


我需要看到原始数据帧的一部分和您预期的输出。数据帧和结果与下面的海报类似,但我得到了一个错误。它说
KeyError:('','发生在索引0')
按照我使用Python 3的方式,虽然我在需要的地方放了括号,但它给出了这个错误。代码在Python 3.6.0.20.3中工作。你们有哪个版本?您的数据或示例中的此表有错误?实际上,在您的数据上它确实有效,但在我的数据(我的错误,我没有提供它们)上它不起作用。如果您愿意,您可以下载数据并亲自尝试:查看帖子,获取更新版本和我的数据。您只需安装geopandas即可处理该文件。谢谢
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
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