Python Pandas:Groupby Sum和连接字符串

2024-06-15 08:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

Pandas数据框示例:

ID Name COMMENT1 COMMENT2 NUM
1  dan  hi       hello    1
1  dan  you      friend   2
3  jon  yeah     nope     3
2  jon  dog      cat      .5
3  jon  yes      no       .1

我正在尝试创建一个数据帧,该数据帧按ID和NAME分组,连接COMMENT1和COMMENT2,COMMENT2也对NUM进行求和

这就是我要找的:

ID Name COMMENT1     COMMENT2        NUM
1  dan  hi you       hello friend    3
3  jon  yeah yes     nope no         3.1
2  jon  dog          cat             .5

我试着用这个:

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

但没用。

如果我用这个:

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

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


Tags: 数据namefriendyouidhellodfinput
3条回答

将数据示例转换为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中遇到的问题和挑战相似,但并不完全相同。

让我们排成一行

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

您还可以告诉.agg()要为每个列和字符串列使用哪个聚合器函数,传递' '.join(注意,没有括号,因为您不想调用.join,而是将其作为参数本身传递):

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

相关问题 更多 >