【问题标题】:Group by one column compare another column and add values to a new column in Python?按一列分组比较另一列并将值添加到Python中的新列?
【发布时间】:2018-06-20 02:34:31
【问题描述】:

我有这些列: index, area, key0

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

#all the ones, all the twos, etc

其中一些(行)是独一无二的。

关于现在不是唯一的:

到目前为止我做了什么:

我必须使用group by 检查哪些组的面积最大,并在名为key1 的新列中将其受人尊敬的key0 值提供给其组中的其他人。

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

dataset

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

【问题讨论】:

  • 我需要查看部分原始数据框和您的预期输出
  • 好吧,数据框和结果就像下面的海报,但我收到一个错误。

标签: python pandas group-by


【解决方案1】:

检查您提供的数据。它有效。没有找到任何“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

【讨论】:

    【解决方案2】:

    你的意思是这样的吗?

    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
    

    【讨论】:

    • 它说 KeyError: ('', 'occurred at index 0') 顺便说一句我使用 Python 3,虽然我把括号放在需要的地方,但它给出了这个错误。
    • 代码在 python 3.6 pandas 0.20.3 中工作。你有哪个版本?您的数据或示例中的此表有错误?
    • 实际上在您的数据上它确实有效,但在我的数据上(我的错误我没有提供它们)它没有。如果您在意,可以下载数据并自己尝试:使用我的数据检查帖子以获取更新版本。您只需安装 geopandas 即可处理该文件。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多