【问题标题】:getting percentage and count Python获取百分比和计数 Python
【发布时间】:2018-10-14 14:38:14
【问题描述】:

假设df.bun(df 是 Pandas 数据框)是一个多索引(日期和名称),变量是用字符串写入的类别值,

date      name             values
20170331  A122630          stock-a
          A123320          stock-a
          A152500          stock-b
          A167860          bond
          A196030          stock-a
          A196220          stock-a
          A204420          stock-a
          A204450          curncy-US
          A204480          raw-material
          A219900          stock-a

我怎样才能用它来表示同一日期的总计数及其百分比,以便用每个日期制作如下表,

date           variable    counts     Percentage
20170331          stock         7           70%
                   bond         1           10%
           raw-material         1           10%
                 curncy         1           10%

我已经完成print(df.groupby('bun').count()) 来解决这个问题,但它缺乏..

cf) 在获取 df.bun 之前,我使用以下代码将嵌套字典导入 Pandas 数据框。

import numpy as np
import pandas as pd

result = pd.DataFrame()
origDict = np.load("Hannah Lee.npy")
for item in range(len(origDict)):
    newdict = {(k1, k2):v2 for k1,v1 in origDict[item].items() for k2,v2 in origDict[item][k1].items()}
    df = pd.DataFrame([newdict[i] for i in sorted(newdict)],
                      index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))
    print(df.bun)

【问题讨论】:

  • 什么是df?如果它有标签,您可以编辑您的问题以添加它,如果没有,您可以编辑您的问题以链接到 df 应该是什么?
  • 数据框不够用。你用哪个包。我想是熊猫,但你的问题并不清楚。此外,通常最好显示(最小)代码,即实际运行

标签: python pandas percentage pandas-groupby


【解决方案1】:

我相信需要SeriesGroupBy.value_counts:

g = df.groupby('date')['values']
df = pd.concat([g.value_counts(), 
                g.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))
print (df)
                       counts  percentage
date     values                          
20170331 stock-a            6        60.0
         bond               1        10.0
         curncy-US          1        10.0
         raw-material       1        10.0
         stock-b            1        10.0

另一个解决方案是使用size 进行计数,然后除以transformsum 创建的新Series

df2 = df.reset_index().groupby(['date', 'values']).size().to_frame('count')
df2['percentage'] = df2['count'].div(df2.groupby('date')['count'].transform('sum')).mul(100)
print (df2)
                       count  percentage
date     values                         
20170331 bond              1        10.0
         curncy-US         1        10.0
         raw-material      1        10.0
         stock-a           6        60.0
         stock-b           1        10.0

解决方案之间的区别首先是按每个组的值排序,然后是 MultiIndex

【讨论】:

  • 再次感谢 jezrael.. 使用 g 作为 df.bun 它就像一个魅力。再次感谢~!!!
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多