【问题标题】:Group Python List Elements分组 Python 列表元素
【发布时间】:2017-04-11 06:38:10
【问题描述】:

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

【问题讨论】:

  • 你试过了吗?
  • @ettanany 我尝试了一些方法但失败了。解决此类问题的最简单方法是什么?
  • 在下面查看我的答案,如果您想要的话,请告诉我。
  • 谢谢,赞成,但对于大型列表,似乎很难使用。你使用熊猫吗?
  • 我不使用 pandas,我下面的答案使用了一些 python 特性/功能(列表理解、压缩、排序等)。

标签: python list pandas numpy


【解决方案1】:

您可以使用本机 python 对列表进行排序,但我发现使用 numpy 获取所需列表最容易。既然你无论如何都要使用 pandas,我认为这是一个可以接受的解决方案:

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,这应该很自然。

【讨论】:

  • @jean 可能,但为什么呢?您的原始数据不在数据框中,至少在您的问题中看起来不像。如果您可以在本机 python 中执行相同操作,我认为没有必要将数据框放在一起进行排序。太多不必要的开销,至少这是我所期望的。
【解决方案2】:

使用以下内容:

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]]

【讨论】:

    【解决方案3】:

    使用 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]] 
    

    【讨论】:

      【解决方案4】:

      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 的 master 添加了一些改进,可以更好地控制转换为表的方式;例如,有 Table.unique 断言表中的每个项目在列表中出现一次,以及 Table.sum;最终由 numpy_indexed 包支持的所有其他减少是有意义的。希望今晚我能发布一个新版本。

      【讨论】:

        猜你喜欢
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2015-08-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 2023-01-12
        相关资源
        最近更新 更多