2016-01-26 3 views
0

У меня есть панд dataframe tsp_data_unique как этот нисходящий ..как организовать панд столбец dataframe в порядке

 order_id quant_bought Clusters 
0  537   2   Cluster 2 
1  540   1   Cluster 10 
2  541   1   Cluster 4 
3  542   2   Cluster 2 
4  543   2   Cluster 2 
5  545   3   Cluster 2 
6  546   2   Cluster 2 
7  548   3   Cluster 1 
8  549   3   Cluster 6 
9  550   4   Cluster 2 
10  553   1   Cluster 11 
11  555   1   Cluster 1 
12  556   1   Cluster 1 
13  557   1   Cluster 3 
14  584   3   Cluster 2 
15  586   3   Cluster 2 
16  587   3   Cluster 5 
17  588   1   Cluster 7 
18  589   1   Cluster 10 
19  590   1   Cluster 9 
20  591   2   Cluster 2 
21  592   3   Cluster 2 
22  593   1   Cluster 2 
23  594   7   Cluster 8 
24  595   3   Cluster 2 
25  596   1   Cluster 1 
26  608   2   Cluster 2 
27  609   4   Cluster 2 

И второй dataframe как df

 Clusters           order_id 
0 Cluster 1        [548, 555, 556, 596] 
1 Cluster 10           [540, 589] 
2 Cluster 11            [553] 
3 Cluster 2 [537, 542, 543, 545, 546, 550, 584, 586, 591, ... 
4 Cluster 3            [557] 
5 Cluster 4            [541] 
6 Cluster 5            [587] 
7 Cluster 6            [549] 
8 Cluster 7            [588] 
9 Cluster 8            [594] 
10 Cluster 9            [590] 

Теперь я хочу устроить order_id's из Cluster 2 от df dataframe Clusters столбец в порядке убывания quant_bought столбец в 1-й информационной кадре.

Я делаю следующее в python.

p = df.order_id[df['Clusters'] == 'Cluster 2'] 
a = tsp_data_unique['order_id'].isin(p.values[0]) 
b = tsp_data_unique['quant_bought'][a] 
b.sort() 
b = b[::-1] 
p = tsp_data_unique['order_id'][b.index] 
list_p = p.values.tolist() 
df.order_id[df['Clusters'] == 'Cluster 2'] = list_p 

Когда я задаю нисходящий упорядоченный список для Cluster 2 в df он дает мне ошибку

ValueError: Length of replacements must equal series length

Пожалуйста, помогите ..

+0

Что рекомендуется выход? – jezrael

ответ

1

Я думаю, что работа со списком в колонке не легко.

Если index значение, где df['Clusters'] == 'Cluster 2' только один, вы можете использовать iloc:

p = df.order_id[df['Clusters'] == 'Cluster 2'] 
a = tsp_data_unique['order_id'].isin(p.values[0]) 
b = tsp_data_unique['quant_bought'][a] 
#replace sort to sort_values, because future warning 
b.sort_values(inplace=True) 
b = b[::-1] 
p = tsp_data_unique['order_id'][b.index] 
list_p = p.values 

print list_p 
[550 586 584 545 591 546 543 542 537] 

idx = df[df['Clusters'] == 'Cluster 2'].index[0] 

print idx 
1 

df['order_id'].iloc[idx] = list_p 

print df.iloc[idx] 
Clusters          Cluster 2 
order_id [550, 586, 584, 545, 591, 546, 543, 542, 537] 
Name: 1, dtype: object 
1

Надеется, что это помогает.

In [25]: tsp_data_unique 
Out[25]: 
    order_id quant_bought cluster 
0  537    2  4 
1  540    1  3 
2  541    5  4 
3  542    1  4 
4  544    2  3 

In [26]: df = tsp_data_unique.sort_values(['cluster', 'order_id'], ascending=[True, False]).groupby('cluster')['order_id'].apply(lambda x: x.tolist()) 

In [27]: df 
Out[27]: 
cluster 
3   [544, 540] 
4 [542, 541, 537] 
Name: order_id, dtype: object 
+0

Я думаю, вы не получили моего вопроса. Я хочу сортировать 'Cluster 2 order_id' в порядке убывания в зависимости от' quant_bought' в первом кадре данных. – Neil

0

Здесь вы пытаетесь присвоить список как элемент в кадре данных. Однако он исключает одно значение в списке, например [5]. Поскольку длина списка, который вы назначаете, равна > 1, а длина значения, которое вы пытаетесь заменить, равна 1, существует несоответствие длины, а python вызывает ошибку.

Чтобы решить эту проблему, попробуйте использовать свой список как первый элемент другого списка, как показано ниже.

df.order_id [ДФ [ 'Кластерные'] == 'Кластер 2'] = [list_p]

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