获得 Python 中百分比和计数的方法

10

假设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()),但它缺少...

附) 在获取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应该是什么? - Mike 'Pomax' Kamermans
数据框不足以完成任务。您使用哪个包呢?我猜是pandas,但从您的问题中并不清楚。此外,通常最好展示(最小化的)代码,以确保其实际可运行。 - hildensia
1个回答

16

我相信需要 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 进行排序。


1
谢谢jezrael再次帮忙。使用g作为df.bun,它的效果非常好。再次感谢您~!!! - Hannah Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接