2017-02-22 13 views
1

У меня есть кадр данных pandas с 7 столбцами. Для одного из этих столбцов я хочу разделить его содержимое на n-ведра в зависимости от значений. Итак, если моя колонка имеет значения 1, 3, 5 ... (2*n+1), я добавляю новый столбец с ведрами как 1,2,3...n.Разделение столбцов данных данных pandas на n кодов

Кроме того, я не хочу нормализовать в том смысле, что даже если у меня есть 100 3 в столбце, я хочу, чтобы они были в одном ведре. Итак, если у меня есть 1, 3, 3, 3, 5, ... (2*n+1), мой вывод будет 1, 2, 2, 2, 3, .. n.

Может кто-нибудь, пожалуйста, назовите меня, как это сделать.

--edit--

Мои фактические данные более чем миллион строк. Итак, если я использую ранг, я получаю звание от 1 до миллиона. Я хочу разделить ряды на ведра. Так, например, если у меня 3 миллиона строк и в конечном итоге с рангом от 1 до 1,5 миллиона. Если я хочу разделить его на 3 ведра, я получаю первое ведро с первым 0,5 млн. Ранга, второе ведро со следующими полумиллионами и так далее. Точно так же, если я хочу разделить его на 7 ведер.

С уважением

+0

К сожалению, для меня это немного неясно. Можете ли вы добавить еще один образец с нужным выходом? – jezrael

+0

@jezrael, конечно. Поэтому, если входной столбец «1,5,3,9,5,3,7,10», то выходной столбец должен иметь «1,3,2,5,3,2,4,6' в качестве вывода – nimbus3000

ответ

1

Вам нужно rank:

df = pd.DataFrame({'col':[1,5,3,9,5,3,7,10]}) 
print (df) 
    col 
0 1 
1 5 
2 3 
3 9 
4 5 
5 3 
6 7 
7 10 

df['col1'] = df.col.rank(method='dense').astype(int) 
print (df) 
    col col1 
0 1  1 
1 5  3 
2 3  2 
3 9  5 
4 5  3 
5 3  2 
6 7  4 
7 10  6 

EDIT: Я думаю, что вам нужно пол разделение //:

n = 3 
df['col1'] = np.arange(len(df.index)) // n 
print (df) 
    col col1 
0 1  0 
1 7  0 
2 3  0 
3 3  1 
4 5  1 
5 7  1 
6 13  2 

Если монотонное увеличение индекса как 0,1,2...n:

n = 3 
df['col1'] = df.index // n 
print (df) 
    col col1 
0 1  0 
1 7  0 
2 3  0 
3 3  1 
4 5  1 
5 7  1 
6 13  2 
+0

, вам нужно «1,4,2,2,3,4,5'? – jezrael

+0

Я удалил свой комментарий, который был в ответ на ваш первый ответ. Я проверяю этот вопрос против моих входов! – nimbus3000

+0

Нет проблем, теперь он получает желаемый результат. – jezrael

0

Панды имеет функцию cut() для такого рода биннинга:

data=pd.Series([1,3,3,3,5,7,13]) 
n_buckets = (data.max() - data.min()) // 2 + 1 
buckets = pd.cut(data, n_buckets, labels=False) + 1 
#0 1 
#1 2 
#2 2 
#3 2 
#4 3 
#5 4 
#6 7