получать проценты и считать Python - PullRequest
0 голосов
/ 04 мая 2018

Suppoose 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)

1 Ответ

0 голосов
/ 04 мая 2018

Я считаю, что нужно 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 для подсчетов и затем делением на новые Series, созданные transform и sum:

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.

...