2015-10-17 3 views
0

У меня есть ряд чисел, которые я разбил на ведра, используя pandas.cut.Python: Как найти свойства элементов в серии

agepreg_cuts = pd.cut(df['agepreg'],[0,20,25,30,pd.np.inf], right=False) 

Затем я подсчитываю и показываю счет.

agepreg_count = (df.groupby(agepreg_cuts).count()) 
agepreg_count 

Что дает мне гораздо больше информации, чем я хочу:

  sest cmintvw totalwgt_lb 
agepreg         
[0, 20) 3182  0   1910 
[20, 25) 4246  0   2962 
[25, 30) 3178  0   2336 
[30, inf) 2635  0   1830 

Теперь я хочу, чтобы отформатировать его, как это:

INAPPLICABLE 352 
0 to 20 3182 
20 to 25 4246 
25 to 30 3178 
30 to 50 2635 
Total 13593 

Который ведет меня пару вопросов.

  1. Как извлечь начальные/конечные свойства (например, 25/30) из бункера [25,30)?
  2. Как узнать свойства в серии, так что мне не нужно спрашивать о предыдущем вопросе?

Для справки, данные я использую приходит от nsfg. В бесплатной книге thinkstats2 указан код и данные компании github.

Из каталога 'code' вы можете запустить следующую строку для загрузки данных.

import nsfg 
df = nsfg.ReadFemPreg() 
df 
+0

Вы в основном с просьбой о доступе к концам точки останова, или о не получении вы «гораздо больше информации, чем [вы] хотят»? – ako

+0

Точки останова –

+0

И я предполагаю, что вы просите больше, чем просто разницу между значениями, если вы передаете список в 'pd.cut' (в вашем списке были эти точки останова' [0,20,25,30 , pd.np.inf] ')? Наверное, я не понимаю вариант использования; ваш желаемый результат, похоже, по-прежнему содержит строку с точками останова в качестве индекса. Может быть, вы просто спрашиваете о том, как создать этот ярлык? – ako

ответ

0

Если вы просто ищете хорошо отформатированные строки (ваш пример показывает его), вы можете использовать label для функции выреза.

## create labels from breakpoints 
breaks=[0,20,25,30,pd.np.inf] 
diff=np.diff(breaks).tolist() 

## make tuples of *breaks* and length of intervals 
joint = list(zip(breaks,diff)) 

## format label 
s1 = "{left:,.0f} to {right:,.0f}" 
labels = [s1.format(left=yr[0], right=yr[0]+yr[1]-1) for yr in joint] 
labels 

['0 to 19', '20 to 24', '25 to 29', '30 to inf'] 

Затем вырезать с помощью breaks и labels.

df['agebin'] = pd.cut(df['agepreg'],breaks, labels=labels, right=False) 

И итог:

df.groupby('agebin')['agebin'].size() 
+0

В вашем примере 'меток' приводит к' [] ', что приводит к ошибке.« Бин-метки должны быть меньше, чем количество краев бункера »при запуске вашего метода вырезания. –

+0

Действительно? Список ярлыков на моем краю меньше, чем список перерывов. Или ваш список ярлыков пуст? – ako

+0

Я использую python 3. Может ли это изменить ситуацию? Я копирую и вставляю свой код в свой редактор и, насколько мне известно, я получаю пустой массив. –

2

Вы можете использовать итерацию по кадру с помощью iterrows, а затем работать на категорического значение как

In [679]: for x, i in agepreg_count.iterrows(): 
    .....:  print ' to '.join(x[1:-1].split(', ')), i['agepreg'] 
    .....: 
0 to 20 0 
20 to 25 43 
25 to 30 27 
30 to inf 30 
+0

Должен ли я разбирать его как строку? Нет ли способа объекта/свойства? –

+1

@PhillipScottGivens (к сожалению) Я думаю, что они хранятся как строки. –

+0

@ AndyHayden, спасибо, я опубликовал [следующий вопрос] (http://stackoverflow.com/questions/33189607/python-introspection-how-would-i-verify-that-values-in-a-series-are -строки) –

Смежные вопросы