组Python列表元素

时间:2016-11-27 12:42:34

标签: python list pandas numpy

我有一个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

4 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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 / pandas,这应该很自然。

答案 2 :(得分:0)

使用pandas执行此操作的方法是提取每个组,提取'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]]

另一种方式是将apply list直接发送到df.groupby('b')['c']这会为您提供所需的对象。然后调用.tolist()方法返回列表列表:

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

答案 3 :(得分: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包支持的所有其他减少都是有意义的。希望我能为今晚做一个新版本。