【问题标题】:Python Pandas: Groupby Sum AND Concatenate StringsPython Pandas:分组求和和连接字符串
【发布时间】:2018-05-15 23:56:20
【问题描述】:

熊猫数据框示例:

ID 名称 COMMENT1 COMMENT2 NUM
1 dan hi 你好 1
1 你的朋友 2
3 乔恩 是的 不 3
2 乔恩狗猫 .5
3 乔恩 是 不 .1

我正在尝试创建一个按 ID 和 NAME 分组的数据框,该数据框将 COMMENT1 和 COMMENT2 连接起来,也就是 NUM。

这就是我要找的:

ID 名称 COMMENT1 COMMENT2 NUM
1 dan hi you hello 朋友 3
3 乔恩 是的 是的 不是的 3.1
2 乔恩狗猫 .5

我试过用这个:

input_df = input_df.groupby(['ID', 'NAME', 'COMMENT1', 'COMMENT2']).sum().reset_index()

但它不起作用。

如果我使用这个:

input_df = input_df.groupby(['ID']).sum().reset_index()

它对 NUM 列求和,但忽略所有其他列。

【问题讨论】:

标签: python pandas


【解决方案1】:

您也可以只告诉.agg() 为每一列使用哪些聚合函数,对于字符串列,传递' '.join(请注意,没有括号,因为您不想调用.join,而是将其作为参数本身传递):

df.groupby(['ID','Name'],as_index=False).agg({'COMMENT1': ' '.join, 'COMMENT2': ' '.join, 'NUM': 'sum'})

【讨论】:

    【解决方案2】:

    将您的数据示例转换为 csv 文件,我们可以执行以下操作:

    import pandas as pd
    
    def grouping_Cols_by_Cols(DF, grouping_Columns, num_Columns):
        # numerical columns can mess us up ...
        column_Names = DF.columns.tolist()
        # so, convert all columns' values to strings
        for column_Name in column_Names:
            DF[column_Name] = DF[column_Name].map(str) + ' '
        DF = DF.groupby(by=grouping_Columns).sum()
    
        # NOW, convert the numerical string columns to an expression ...
        for num_Col in num_Columns:
            column_Names = DF.columns.tolist()
            num_Col_i = column_Names.index(num_Col)
            for i in range(len(DF)):
                String = DF[num_Col].iloc[i] 
                value = eval(String.rstrip(' ').replace(' ','+'))
                DF.iat[i,num_Col_i] = value
    
        return DF
    
    ###############################################################
    ### Operations Section
    ###############################################################
    
    df = pd.read_csv("UnCombinedData.csv")
    
    grouping_Columns = ['ID','Name']
    num_Columns = ['NUM']
    df = grouping_Cols_by_Cols(df,grouping_Columns, num_Columns)
    
    print df
    

    再做一些工作,定义的函数可以自动检测哪些列中有数字并将它们添加到数字列列表中。

    我认为这与this post 中遇到的问题和挑战类似,但并不完全一致。

    【讨论】:

      【解决方案3】:

      让我们把它变成一行

      df.groupby(['ID','Name'],as_index=False).agg(lambda x : x.sum() if x.dtype=='float64' else ' '.join(x))
      Out[1510]: 
         ID Name  COMMENT1      COMMENT2  NUM
      0   1  dan    hi you  hello friend  3.0
      1   2  jon       dog           cat  0.5
      2   3  jon  yeah yes       nope no  3.1
      

      【讨论】:

      • 如果组中有一个 NaN 这不起作用,对吗?
      • @Yuca 你的意思是组键?
      • 如果用 NaN 代替 'cat',那么看起来代码不起作用,不是吗?
      • @Yuca 您可以将 NaN 替换为“NaN”以供将来调整
      • @WeNYoBen,谢谢。这是否保留了正在连接的 pandas 数据框列中字符串的顺序?
      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多