Pandas按特定列的总和分组,并保留其他列

2024-09-30 08:22:38 发布

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

我正在尝试做一些简单的事情。。。 我有一个dataframe,我试图按一个特定的列进行分组,输出dataframe需要保留一列,并对另外两列求和。 以下是一个例子:

df:

User  Col1ToSum  Col2ToSum   ColToKeep
ABC     10         440         1.015
ABC     15         410         1.015
ABC     15        -200         1.015
ABA     100        110         2.24 
ABA     80        -10          2.24
AAA     40         10          nan
AAA     20         10          nan
BBB     10         15          nan
XYZ     10         10          1.1
XYZ     10         10          1.5 (note the 'ColToKeep' is different for user XYZ)

预期产出:

User  Col1ToSum  Col2ToSum   ColToKeep
ABC     45         650         1.015
ABA     180        100         2.24
AAA     60         20          nan
BBB     10         15          nan
XYZ     10         10          1.1
XYZ     10         10          1.5

我试着做:

  1. df.groupby(['User', 'ColToKeep'], as_index=False).mean() 不幸的是,它正在删除ColToKeep为nan且要求和的两列不是sum的任何记录
  2. df.groupby(['User'], as_index=False)['Col1ToSum', 'Col2ToSum'].sum() 不幸的是,它正在删除输出df中的“ColToKeep”列
  3. df.groupby(['User', 'ColToKeep'], as_index=False)['Col1ToSum', 'Col2ToSum'].sum()但与第1点相同)它正在删除ColToKeep为nan的记录

我之所以尝试按用户和coltokep分组,是因为如果用户相同,但coltokep不同,我希望有2条记录

我不知道为什么group by会删除nan值(可能是因为我缺乏与panda合作的经验…)

请您在上述方面提供帮助,或者解释为什么会发生这种情况


Tags: falsedfindexasnansumabcgroupby
2条回答

熊猫支持来自1.1版本linkgroupby中缺少的值

第一个想法是创建新的辅助列new,将缺少的值替换为某些字符串,例如miss,然后按new分组,按^{}^{}聚合,最后按第一个reset_index删除辅助级别:

df = (df.assign(new= df['ColToKeep'].fillna('miss'))
       .groupby(['User', 'new'], sort=False)
       .agg({'Col1ToSum':'sum', 'Col2ToSum':'sum', 'ColToKeep':'first'})
       .reset_index(level=1, drop=True)
       .reset_index())
print (df)
  User  Col1ToSum  Col2ToSum  ColToKeep
0  ABC         40        650      1.015
1  ABA        180        100      2.240
2  AAA         60         20        NaN
3  BBB         10         15        NaN
4  XYZ         10         10      1.100
5  XYZ         10         10      1.500

另一个想法是将miss替换回NaN

df = (df.assign(ColToKeep = df['ColToKeep'].fillna('miss'))
       .groupby(['User', 'ColToKeep'], sort=False)[['Col1ToSum', 'Col2ToSum']].sum()
       .reset_index()
       .replace({'ColToKeep': {'miss':np.nan}}))
print (df)
  User  ColToKeep  Col1ToSum  Col2ToSum
0  ABC      1.015         40        650
1  ABA      2.240        180        100
2  AAA        NaN         60         20
3  BBB        NaN         10         15
4  XYZ      1.100         10         10
5  XYZ      1.500         10         10

将“ColToKeep”更改为字符串,然后使用代码

In : df['ColToKeep'] = df['ColToKeep'].astype(str)

In : df.groupby(['User','ColToKeep'], as_index=False).sum()
Out: 
  User ColToKeep  Col1ToSum  Col2ToSum
0  AAA       nan         60         20
1  ABA      2.24        180        100
2  ABC     1.015         40        650
3  BBB       nan         10         15
4  XYZ       1.1         10         10
5  XYZ       1.5         10         10

如有必要,可以通过以下方式将COLTOTKEEP更改回浮动:

df1 = df.groupby(['User','ColToKeep'], as_index=False).sum()

df1['ColToKeep'] = df1['ColToKeep'].astype(float)

print(df1)
  User  ColToKeep  Col1ToSum  Col2ToSum
0  AAA        NaN         60         20
1  ABA      2.240        180        100
2  ABC      1.015         40        650
3  BBB        NaN         10         15
4  XYZ      1.100         10         10
5  XYZ      1.500         10         10

相关问题 更多 >

    热门问题