2016-11-27 126 views
-1

我有一個Python列表如下:集團Python列表元素

my_list = 

[[25, 1, 0.65], 
[25, 3, 0.63], 
[25, 2, 0.62], 
[50, 3, 0.65], 
[50, 2, 0.63], 
[50, 1, 0.62]] 

我想按照這個規則對它們進行排序:

1 --> [0.65, 0.62] <--25, 50 
2 --> [0.62, 0.63] <--25, 50 
3 --> [0.63, 0.65] <--25, 50 

所以預期的結果如下:

Result = [[0.65, 0.62],[0.62, 0.63],[0.63, 0.65]] 

如何做到這一點的傢伙?

我試過如下:

df = pd.DataFrame(my_list,columns=['a','b','c']) 
res = df.groupby(['b', 'c']).get_group('c') 
print res 

ValueError: must supply a tuple to get_group with multiple grouping keys 
+0

您是否嘗試過的東西? – ettanany

+0

@ettanany我嘗試了一些方法,但失敗了。解決這類問題的最簡單方法是什麼? – jean

+0

檢查我的回答如下,讓我知道,如果這就是你想要的。 – ettanany

回答

1

您可以按與原生的Python的名單,但我發現最簡單的方法是使用numpy來獲取你需要的列表。既然你還是要用熊貓,我認爲這是一個可以接受的解決方案:

from operator import itemgetter 
import numpy as np 
# or just use pandas.np if you have that already imported 

my_list = [[25, 1, 0.65], 
[25, 3, 0.63], 
[25, 2, 0.62], 
[50, 3, 0.65], 
[50, 2, 0.63], 
[50, 1, 0.62]] 

sorted_list = sorted(my_list,key=itemgetter(1,0)) # sort by second and first column 
sliced_array = np.array(sorted_list)[:,-1].reshape(-1,2) 
final_list = sliced_array.tolist() # to get a list 

主要的一點是使用itemgetter對兩列一前一後進行排序列表。生成的排序列表包含第三列中的必需元素,我使用numpy進行提取。它可以與原生的Python來完成的,但如果你已經使用numpy的/熊貓,這應該是自然的。

+0

可以使用groupby完成嗎? – jean

+0

@jean它可能,但爲什麼?您的原始數據不在數據框中,至少在您的問題中不是這樣。如果你可以在本地python中做同樣的事情,我認爲沒有必要把數據框放在一起進行排序。太多不必要的開銷,至少這是我所期望的。 –

1

使用以下:

my_list = [[25, 1, 0.65], [25, 3, 0.63], [25, 2, 0.62], [50, 3, 0.65], [50, 2, 0.63], [50, 1, 0.62]] 

list_25 = sorted([item for item in my_list if item[0] == 25], key=lambda item: item[1]) 
list_50 = sorted([item for item in my_list if item[0] == 50], key=lambda item: item[1]) 

res = [[i[2], j[2]] for i,j in zip(list_25, list_50)] 

輸出:

>>> res 
[[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 
0

一種方法用大熊貓做,這是提取各組,拔出'c',轉換到一個列表,並追加到你想要的清單:

z = [] 
>>> for g in df.groupby('b'): 
     z.append(g[1]['c'].tolist()) 

>>> z 
[[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 

你可以做到這一點作爲一個列表理解:

>>> res = [g[1]['c'].tolist() for g in df.groupby('b')] 

>>> res 
[[0.65, 0.62], [0.62, 0.63], [0.63, 0.65]] 

另一種方法是applylist直接df.groupby('b')['c']這給你所需要的對象。然後調用.tolist()方法返回一個列表的列表:

>>> df.groupby('b')['c'].apply(list).tolist() 
[[0.65000000000000002, 0.62], [0.62, 0.63], [0.63, 0.65000000000000002]] 
0

numpy_indexed包(免責聲明:我是它的作者)有一個班輪爲這些類型的問題:

import numpy_indexed as npi 
my_list = np.asarray(my_list) 
keys, table = npi.Table(my_list[:, 1], my_list[:, 0]).mean(my_list[:, 2]) 

注意如果列表中存在重複值,則平均值將在表中報告。

編輯:增加了一些改進numpy_indexed的主人,允許了你轉換成表格的方式更多的控制;例如,Table.unique聲明表中的每個項目都在列表中出現一次,而Table.sum;並最終通過numpy_indexed軟件包支持的所有其他減少都是有意義的。希望我能爲今晚做一個新的發佈。