2016-12-05 11 views
0

Pandas dataframe (x) с двумя столбцами: сумма и значение. sum - количество записей имеет одинаковое значение. Например:pandas cut by mount column

sum value 
2  3 
4 1 

означает 2 записи имеет значение 3 и 4 записи имеет значение 1 И то, что я хочу сделать, это: сортировка по значению, а затем разрезать [1,1,1,1,3,3] на 3 части: [1,1], [1,1], [3,3]

Как вырезать значение на 3 части и каждая часть имеет равное количество записей?

pandas.cut не может принимать столбец суммы во внимание

+1

Итак, вы хотите разделить '[3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]' на три? Каковы правила для этого? –

+0

@JonClements Да, я добавил правила в свой вопрос –

+0

Правильно ... так как упорядочивается разделение ... почему это не '' [[3, 3], [1, 1], [1, 1]] или других комбинаций? –

ответ

1

Я думаю, что вы можете использовать cumsum с двойным numpy.where:

sumall = df['sum'].sum() 
df = df.sort_values(by='value') 
df['sum_sum'] = df['sum'].cumsum() 
df['tag'] = np.where(df['sum_sum'] < sumall/3, 0, 
      np.where(df['sum_sum'] < 2 * sumall/3, 1, 2)) 

print (df) 
    sum value sum_sum tag 
1 4  1  4 2 
0 2  3  6 2 
+0

Если сумма слишком велика для повторения записи? –

+0

Можете ли вы подробнее объяснить? Проблема с памятью? – jezrael

+0

Я пытаюсь изменить вашу функцию, пожалуйста, проверьте, работает ли она хорошо. – jezrael

0

это работает для меня. но уродливый:

sum = df['sum'].sum() 
def func(x): 
    if x < sum/3: 
     return 0 
    elif x < 2 * sum/3: 
     return 1 
    return 2 
df = df.sort_values(by='value') 
df['sum_sum'] = np.cumsum(df['sum'].values) 
df['tag'] = df['sum_sum'].apply(func)