Python df groupby与agg的字符串和总和

时间:2018-11-21 10:47:18

标签: python pandas pandas-groupby

以这个df DF为基础,我想要以下输出:resultDF

因此,当第1列的字符串具有相同的名称时,应按第0列汇总所有数据,并添加第1列的所有字符串,并对第2列的数字求和。

使用以下代码,我可以聚合字符串,但不对数字求和:

df2= df1.groupby([0]).agg(lambda x: ','.join(set(x))).reset_index()
df2

uncompleteSolutiondf

2 个答案:

答案 0 :(得分:1)

避免任意数量的列

您想要的输出建议您有任意数量的列,具体取决于每个组1的{​​{1}}中的值数量。这是反熊猫,强烈针对任意数量的。因此,逐个序列操作是首选。

因此,您只需使用0 + groupby即可存储您所需的所有信息。

sum
               0     1  2
0  2008-04_E.pdf  Mat1  3
1  2008-04_E.pdf  Mat2  2

但是,如果您坚持要...

如果您坚持自己的特殊要求,则可以通过上述计算的df = pd.DataFrame({0: ['2008-04_E.pdf']*3, 1: ['Mat1', 'Mat2', 'Mat2'], 2: [3, 1, 1]}) df_sum = df.groupby([0, 1]).sum().reset_index() print(df_sum) 如下实现。

df_sum
                  Key1  Key2  Key1  Key2
0  2008-04_E.pdf  Mat1  Mat2     3     2

答案 1 :(得分:1)

这似乎是一个两步过程。它还要求第1列中的每个组在第2列中具有相同数量的唯一元素。首先,按要分组的列进行分组

df_grouped = df.groupby([0,1]).sum().reset_index()

然后重塑为所需的表单:

def group_to_row(group):
    group = group.sort_values(1)
    output = []
    for i, row in group[[1,2]].iterrows():
        output += row.tolist()
    return pd.DataFrame(data=[output])

df_output = df_grouped.groupby(0).apply(group_to_row).reset_index()

这是未经测试的,但这也是一种非标准格式,因此很遗憾,我认为没有为您提供标准的Pandas函数。