【问题标题】:Merging summing and excluding in Pandas_Python在 Pandas_Python 中合并求和和排除
【发布时间】:2018-06-22 15:34:33
【问题描述】:

我正在尝试使用此 Python 脚本合并重复的行。我用逗号分隔一列,然后对其余列求和,最后使用 pandas 删除重复项,但我需要排除某些行的求和。例如,我不希望 poly_area 和 total_area 是总和。我该怎么办?

import pandas as pd

output = r'C:dummy'

    fieldlist = ["FID","total_area","POLY_AREA", "PERCENTAGE","C5_3","M1_4","M1_4_R6A","M1_4_R6B", "M1_4_R7A", "M1_5_R10",
                 "M1_5_R7_3","M1_5_R9","M1_6_R10","PARK","R6A", "R6B", "R7A"]

    #Create dataframe from cursor
    df = pd.DataFrame.from_records(data=arcpy.da.SearchCursor('calculations', fieldlist), columns = fieldlist)

    #Create a new dataframe of FIDS and comma-separated percentages
    df1 = df.groupby("FID")["PERCENTAGE"].apply(lambda x: ", ".join(x.astype(str))).reset_index()

    #Create a new dataframe of sums per FID
    df2 = df.groupby("FID").sum()
    df2.drop("PERCENTAGE", axis=1, inplace=True)

    #Merge/join them together and export as csv
    df1.merge(df2, left_on="FID", right_index=True).to_csv(path_or_buf=output, index=False)

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    这将完成这项工作,只需用这个替换你所拥有的。

     #Create a new dataframe of FIDS and comma-separated percentages
    df1 = df.groupby(["FID","total_area","POLY_AREA"])["PERCENTAGE"].apply(lambda x: ", ".join(x.astype(str))).reset_index()
    
    #Create a new dataframe of sums per FID
    df2 = df.groupby("FID").sum()
    df2.drop(["total_area","POLY_AREA","PERCENTAGE"], axis=1, inplace=True)
    

    【讨论】:

      【解决方案2】:

      您可以在创建 df2 时尝试获取列的子集,以便排除不需要的内容。具体尝试像这样创建 df2:

      df2_cols = [col for col in fieldlist if col not in ['FID', 'total_area', 'POLY_AREA']]
      df2 = df.groupby("FID")[df2_cols].sum()
      

      您也可以在创建合并的 df 后只 drop 不需要的列。

      【讨论】:

      • 我试图避免循环,但我试图将它用于 df2 但它给了我错误。 df2 = df.groupby(["FID","total_area","POLY_AREA"]).sum() ValueError: len(left_on) 必须等于 "right" 索引中的层数
      • 我想您可以执行df2_cols = list(set(fieldlist) - set(['FID', 'total_area', 'POLY_AREA'])) 之类的操作来避免循环,但它可能会重新排序您的列,因为集合不保留顺序。查看this 答案,了解如何获取不在另一个列表中的列表子集。
      • 另外,这有点超出您的问题的范围,但循环(在我的回答中)和使用设置差异(在我的评论中)之间的性能差异在我的系统上约为 0.08 µs。维持订单只需付出很小的代价:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 2021-11-16
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多