【问题标题】:How to convert list column to a non-nested list?如何将列表列转换为非嵌套列表?
【发布时间】:2017-11-28 22:37:56
【问题描述】:

当列元素为列表时,如何将列转换为非嵌套列表?

比如列是like

column
[1, 2, 3]
[1, 2]

我终于要关注了。

[1,2,3,1,2]

但是现在有了column.tolist(),我会得到

[[1,2,3],[1,2]]

编辑:感谢您的帮助。我的目的是找到最简单(优雅)和有效的方法来做到这一点。现在我使用@jezrael 方法。

from itertools import chain
output = list(chain.from_iterable(df[column])

@piRSquared 提供了最简单的方法,但可能更慢。

output = df[column].values.sum()

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我们使用+ 运算符连接列表。因为当您调用 pd.Series.sum 时,pandas 系列使用其底层 + 操作的元素,所以我们可以连接一整列或一系列列表。

    df.column.sum()
    
    [1, 2, 3, 1, 2]
    

    但如果你追求性能,可以考虑cytoolz.concat

    import cytoolz
    
    list(cytoolz.concat(df.column.values.tolist()))
    
    [1, 2, 3, 1, 2]
    

    【讨论】:

    • 嗯,但是真的很慢... plus1
    • :-) 不想在这方面做得很快。但它是最简单的。
    • 没错,就是最简单的。
    【解决方案2】:

    另一个可行的解决方案是list.extend() 方法。

    list = [] for row in column: list.extend(row)

    【讨论】:

      【解决方案3】:

      你可以使用numpy.concatenate:

      print (np.concatenate(df['column'].values).tolist())
      [1, 2, 3, 1, 2]
      

      或者:

      from  itertools import chain
      print (list(chain.from_iterable(df['column'])))
      [1, 2, 3, 1, 2]
      

      另一种解决方案,谢谢juanpa.arrivillaga:

      print ([item for sublist in df['column'] for item in sublist])
      [1, 2, 3, 1, 2]
      

      时间安排

      df = pd.DataFrame({'column':[[1,2,3], [1,2]]})
      df = pd.concat([df]*10000).reset_index(drop=True)
      print (df)
      
      In [77]: %timeit (np.concatenate(df['column'].values).tolist())
      10 loops, best of 3: 22.7 ms per loop
      
      In [78]: %timeit (list(chain.from_iterable(df['column'])))
      1000 loops, best of 3: 1.44 ms per loop
      
      In [79]: %timeit ([item for sublist in df['column'] for item in sublist])
      100 loops, best of 3: 2.31 ms per loop
      
      In [80]: %timeit df.column.sum()
      1 loop, best of 3: 1.34 s per loop
      

      【讨论】:

      • 谢谢?但是是否存在任何其他method 可以同时做concattolist
      • @danche 不太可能。 pandas 并非旨在将 lists 保存为值。
      • @juanpa.arrivillaga - 谢谢
      • @juanpa.arrivillaga - 我很喜欢你的解决方案很长一段时间,但在阅读this timings 之后我开始更喜欢chain.from_iterable 什么更快。
      • @jezrael 哇,我经常使用这两种方法,从不真正偏爱其中一种。我认为一个会稍微好一点,但从未想过差异会是 2 倍。很高兴知道。
      【解决方案4】:

      你可以使用 list 的 append 方法来做到这一点:

      col = {'col': [[1, 2, 3], [1, 2]]}
      last = []
      last.extend([i for c in col['col'] for i in c])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        相关资源
        最近更新 更多