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