【问题标题】:Getting percent of totals in a pandas dataframe在 pandas 数据框中获取总数的百分比
【发布时间】:2018-09-20 22:32:49
【问题描述】:

我有一个按以下方式配置的数据框:

date_string | type | amount

 2015-01-01 |  a   | 500

 2015-01-01 |  b   | 300

 2015-01-01 |  c   | 200

 2015-01-02 |  a   | 400

 2015-01-02 |  b   | 600

 2015-01-02 |  c   | 100

我希望添加一个新列,其中包含按日期细分的总百分比,并得到如下内容:

date_string | type | amount | percent

 2015-01-01 |  a   | 500    | 0.5

 2015-01-01 |  b   | 300    | 0.3

 2015-01-01 |  c   | 200    | 0.2

 2015-01-02 |  a   | 300    | 0.3

 2015-01-02 |  b   | 600    | 0.6

 2015-01-02 |  c   | 100    | 0.1

【问题讨论】:

标签: python pandas


【解决方案1】:

使用GroupBy.transformsum,除以原始列除以Series.div

df['percent'] = df['amount'].div(df.groupby('date_string')['amount'].transform('sum'))
print (df)
  date_string type  amount   percent
0  2015-01-01    a     500  0.500000
1  2015-01-01    b     300  0.300000
2  2015-01-01    c     200  0.200000
3  2015-01-02    a     400  0.363636
4  2015-01-02    b     600  0.545455
5  2015-01-02    c     100  0.090909

【讨论】:

  • 对于其他用户。 transform 在使用可用的字符串选项之一时非常有效,在这种情况下为'sum',而不是在transform 中使用lambda。因此,最好像@jezrael 所做的那样将当前的'amount' 列除以transform('sum') 的结果。
  • 这正是我一直在寻找的,而且它有效!我会尽快接受你的回答(7 分钟)
  • @piRSquared - 谢谢。
  • 他的数字让我觉得也许 df['percent'] = df.amount/1000 会起作用
【解决方案2】:

这会起作用

import numpy as np
df.groupby(['amount', 'date_string']).sum().transform(lambda x: x/np.sum(x))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2014-06-16
    相关资源
    最近更新 更多