2016-11-27 71 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软件包支持的所有其他减少都是有意义的。希望我能为今晚做一个新的发布。