【问题标题】:Rounding up values in the column after aggregation聚合后对列中的值进行四舍五入
【发布时间】:2019-09-23 21:44:35
【问题描述】:

我是 pandas 的新手,我知道如何将列值格式化为字符串以将它们四舍五入并将它们转换为百分比。但是我在使用agg() 方法创建的列上执行此操作时遇到问题:

debtors_by_purpose = data.groupby('purpose_id').agg({'debt': ['sum', 'count', 'mean']})
debtors_by_purpose['debt']['mean'] = debtors_by_purpose['debt']['mean'].apply('{:.2%}'.format)
debtors_by_purpose

我怀疑它不改变的原因是链式索引,但我不知道有任何其他方法可以访问由agg() 方法创建的列中的元素。我不能在这里使用loc[]。也许有一种方法可以将format() 方法放在agg() 调用中?或者,也许其他一些四舍五入的方法在这里会更好?

编辑:为了清楚起见,问题不在于右边的表达式不起作用。它确实有效,我想我没有做一个更抽象的例子是我的错。问题是这个表达式的结果没有通过赋值运算符保存在表中,因为我不知道在这种情况下如何避免链式索引。我也可以把零放在那里来说明零没有被保存。

【问题讨论】:

  • 改成apply to map是否有效.map('{:.2%}'.format)
  • @MichaelGardner 不,它没有。如果我只是把它作为一个没有赋值的表达式,那么两个版本都可以工作。但是对于分配,两个版本都不会影响原始版本。我很确定链式索引是罪魁祸首。

标签: python pandas aggregate rounding


【解决方案1】:

在:

data = {'purpose_id': [1,1,2,2,3,3], 'debt':[50.2,100.80,50.5,200.54,50.02,150.55]}
df = pd.DataFrame(data)
group = df.groupby('purpose_id').agg({'debt': ['sum', 'count', 'mean']})

group['debt', 'mean'] = group['debt', 'mean'].map('{:.2%}'.format))

# OR

group.loc[:, ('debt', 'mean')] = group.loc[:, ('debt', 'mean')].map('{:.2%}'.format)

输出:

        debt
    sum count   mean
purpose_id          
1   151.00  2   7550.00%
2   251.04  2   12552.00%
3   200.57  2   10028.50%

【讨论】:

  • 恐怕你不明白这个问题。您的代码和我的代码一样,用于 display 目的。但我想要做的是 change 表本身的值,以保存结果。这就是我需要帮助的地方。另外,不太清楚为什么要除以 1000。
  • 您没有提供示例数据或预期的输出,所以我不确定您想要什么。 stackoverflow.com/help/minimal-reproducible-example
  • 我想要的只是将您在“out”部分中获得的内容保存在 group['debt']['mean'] 中以便以后访问,而不是只打印一次.我想这个确切的例子甚至不如“在使用多级列时如何避免链式分配?”这个更一般的问题的答案重要。我只是想要一种方法来访问“平均”列作为 修改原始视图,而不是作为副本。
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多