Использование pd.cut & pd.vales_count приводит к получению 2d массива - PullRequest
0 голосов
/ 04 ноября 2018

Вариант использования

  1. Я получаю случайные наблюдения от населения.
  2. Затем я группирую их по bin, используя pd.cut
  3. Затем я извлекаю значения с помощью pd.values_counts
  4. Я хочу получить рассчитанный интервал меток и счетчик частоты
  5. Я хочу «приклеить» столбец меток к столбцу подсчетов частоты, чтобы получить 2d массив (с 2 столбцами и n интервалами)
  6. Я хочу преобразовать 2d массив в список для COM-взаимодействия.

Я близок к желаемому выводу, но я новичок в Python, поэтому какой-то умник может оптимизировать мой код метки.

Проблема здесь заключается в ограничении конечного вывода, который должен быть списком, чтобы его можно было распределить через слой взаимодействия COM в Excel VBA.

import inspect
import numpy as np
import pandas as pd
from scipy.stats import skewnorm

pop = skewnorm.rvs(0, size=20)
bins=[-5,-4,-3,-2,-1,0,1,2,3,4,5]
bins2 = np.array(bins)
bins3 = pd.cut(pop,bins2)
bins4 = [0]*(bins2.size-1)

#print my own labels, doh!
idx=0
for binLoop in bins3.categories:
    intervalAsString="(" + str(binLoop.left)+ "," + str(binLoop.right)+"]" 
    print (intervalAsString)
    bins4[idx]=intervalAsString
    idx=idx+1


table = pd.value_counts(bins3, sort=False)

joined = np.vstack((bins4,table.tolist()))

print (joined)

Целевой вывод 2d массива, конвертируемого в список

|  (-5, -4]  |  0  |
|  (-4, -3]  |  0  |
|  (-3, -2]  |  0  |
|  (-2, -1]  |  1  |
|  (-1, 0]   |  3  |
|  (0, 1]    |  9  |
|  (1, 2]    |  4  |
|  (2, 3]    |  2  |
|  (3, 4]    |  1  |
|  (4, 5]    |  0  |

1 Ответ

0 голосов
/ 04 ноября 2018

Если я вас правильно понимаю, следующее должно делать то, что вы после:

pop = skewnorm.rvs(0, size=20)
bins = range(-5, 5)
binned = pd.cut(pop, bins)

# create the histogram data
hist = binned.value_counts()

# hist is a pandas series with a categorical index describing the bins
# `index.astype(str)` will convert the categories to strings.
hist.index = hist.index.astype(str)

# `.reset_index()` will turn the index into an ordinary column
# `.values` gives you the underlying numpy array
# `tolist()` converts the numpy array to a native python list o' lists.
print(hist.reset_index().values.tolist())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...