2015-07-17 2 views
0

У меня есть DataFrame как этотКак я могу квантовать данные в пандах?

a = pd.DataFrame(a.random.random(5, 10), columns=['col1','col2','col3','col4','col5']) 

я хотел бы квантовать конкретный столбец, скажем, col4, в соответствии с набором порогов (соответствующий выход может быть целым числом от 0 до числа уровней). Есть ли API для этого?

+0

также, это то, что вы имели в виду, чтобы написать: '' 'а = pd.DataFrame (pd.np.random.random ((5, 5)), столбцы = [ 'col1', 'col2 ',' col3 ',' col4 ',' col5 ']) '' '?? – dermen

ответ

2

Большинство pandas objects совместимы с функциями numpy. Я хотел бы использовать numpy.digitize:

import pandas as pd 

a = pd.DataFrame(pd.np.random.random((5, 5)), columns=['col1','col2','col3','col4','col5']) 
#  col1  col2  col3  col4  col5 
#0 0.523311 0.266401 0.939214 0.487241 0.582323 
#1 0.274436 0.761046 0.155482 0.630622 0.044595 
#2 0.505696 0.953183 0.643918 0.894726 0.466916 
#3 0.281888 0.621781 0.900743 0.339057 0.427644 
#4 0.927478 0.442643 0.541234 0.450761 0.191215 

pd.np.digitize(a.col4, bins = [0.3,0.6,0.9 ] ) 
#array([1, 2, 2, 1, 1]) 
1

Вы можете использовать pandas.DataFrame.quantile, который использует numpy.percentile

Вы можете прочитать ДОКУМЕНТАЦИЯ here

Но, может быть, вы ищете pd.qcut, в отношении этого @cchi дал прекрасный пример ниже.

4

Возможно является то, что вы ищете. Короткий ответ:

df['quantized'] = pd.qcut(df['col4'], 5, labels=False)

Longer объяснение:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame(np.random.randn(10, 5), columns=['col1','col2','col3','col4','col5']) 
>>> df 
     col1  col2  col3  col4  col5 
0 0.502017 0.290167 0.483311 1.755979 -0.866204 
1 0.374881 -1.372040 -0.533093 1.559528 -1.835466 
2 -0.110025 -1.071334 -0.474367 -0.250456 0.428927 
3 -2.070885 0.095878 -3.133244 -1.295787 0.436325 
4 -0.974993 0.591984 -0.839131 -0.949721 -1.130265 
5 -0.383469 0.453937 -0.266297 -1.077004 0.123262 
6 -2.548547 0.424707 -0.955433 1.147909 -0.249138 
7 1.056661 0.949915 -0.234331 -0.146116 0.552332 
8 0.029098 -1.016712 -1.252748 -0.216355 0.458309 
9 0.262807 0.029040 -0.843372 0.492120 0.128395 

Вы можете использовать pd.qcut(), чтобы получить соответствующий диапазон.

>>> q = pd.qcut(df['col4'], 5) 
>>> q 
0  (1.23, 1.756] 
1  (1.23, 1.756] 
2  (-0.975, -0.23] 
3 [-1.296, -0.975] 
4  (-0.975, -0.23] 
5 [-1.296, -0.975] 
6  (0.109, 1.23] 
7  (-0.23, 0.109] 
8  (-0.23, 0.109] 
9  (0.109, 1.23] 
Name: col4, dtype: category 
Categories (5, object): [[-1.296, -0.975] < (-0.975, -0.23] < (-0.23, 0.109] < (0.109, 1.23] < (1.23, 1.756]] 

Вы можете установить параметр labels=False, чтобы получить целое число Представительские

>>> q = pd.qcut(df['col4'], 5, labels=False) 
>>> q 
0 4 
1 4 
2 1 
3 0 
4 1 
5 0 
6 3 
7 2 
8 2 
9 3 
dtype: int64 
  • Первый аргумент является массивом или серии.
  • Второй аргумент - это количество квантилей, которое вы хотите.
  • Документация для получения дополнительных сведений. http://pandas.pydata.org/pandas-docs/stable/generated/pandas.qcut.html
+0

По какой-то причине вышеприведенное не работает в python 2.7. Я получаю следующую ошибку: IndexError: только целые числа, срезы (':'), ellipsis ('...'), numpy.newaxis ('None') и целые или логические массивы являются действительными индексами – scv