首页 > 解决方案 > Python df groupby 带有用于字符串和总和的 agg

问题描述

以这个df东风为基础,我想要以下输出:结果DF

因此,所有内容都应按第 0 列聚合,并且应添加第 1 列中的所有字符串,并且当第 1 列中的字符串具有相同名称时,应将第 2 列中的数字相加。

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

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

未完成的解决方案df

标签: pythonpandaspandas-groupby

解决方案


避免任意数量的列

您所需的输出表明您有任意数量的列,具体取决于1每个 group中的值的数量0。这是反熊猫,它强烈地面向任意数量的。因此,串行操作是首选。

因此,您可以使用groupby+sum来存储您需要的所有信息。

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)
               0 1 2
0 2008-04_E.pdf Mat1 3
1 2008-04_E.pdf Mat2 2

但如果你坚持...

如果你坚持你的不寻常的要求,你可以通过df_sum上面的计算来实现它。

key = df_sum.groupby(0)[1].cumcount().add(1).map('Key{}'.format)
res = df_sum.set_index([0, key]).unstack().reset_index().drop('key', axis=1)

res.columns = res.columns.droplevel(0)

print(res)
                  键 1 键 2 键 1 键 2
0 2008-04_E.pdf Mat1 Mat2 3 2

推荐阅读