【问题标题】:How do I turn a dataframe into a series of lists?如何将数据框变成一系列列表?
【发布时间】:2016-12-07 09:08:48
【问题描述】:

我不得不多次这样做,但我总是很沮丧。我有一个数据框:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'], ['A', 'B', 'C', 'D'])

print df

   A  B  C  D
a  1  2  3  4
b  5  6  7  8

我想把df变成:

pd.Series([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'])

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

我试过了

df.apply(list, axis=1)

这让我回到原来的df

什么是方便/有效的方法?

【问题讨论】:

    标签: python list pandas dataframe series


    【解决方案1】:

    您可以先通过valuesDataFrame 转换为numpy array,然后转换为列表,最后如果需要更快的解决方案,则使用df 的索引创建新的Series

    print (pd.Series(df.values.tolist(), index=df.index))
    a    [1, 2, 3, 4]
    b    [5, 6, 7, 8]
    dtype: object
    

    小DataFrame的时序:

    In [76]: %timeit (pd.Series(df.values.tolist(), index=df.index))
    1000 loops, best of 3: 295 µs per loop
    
    In [77]: %timeit pd.Series(df.T.to_dict('list'))
    1000 loops, best of 3: 685 µs per loop
    
    In [78]: %timeit df.T.apply(tuple).apply(list)
    1000 loops, best of 3: 958 µs per loop
    

    和大:

    from string import ascii_letters
    letters = list(ascii_letters)
    df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                      pd.MultiIndex.from_product([letters, letters]),
                      letters)
    
    In [71]: %timeit (pd.Series(df.values.tolist(), index=df.index))
    100 loops, best of 3: 2.06 ms per loop
    
    In [72]: %timeit pd.Series(df.T.to_dict('list'))
    1 loop, best of 3: 203 ms per loop
    
    In [73]: %timeit df.T.apply(tuple).apply(list)
    1 loop, best of 3: 506 ms per loop
    

    【讨论】:

      【解决方案2】:

      pandas 非常努力地使数据帧变得方便。因此,它将列表和数组解释为您想要拆分为列的内容。我不会抱怨,这几乎总是有帮助的。

      我已经做到了这两种方式之一。

      选项 1

      # Only works with a non MultiIndex
      # and its slow, so don't use it
      df.T.apply(tuple).apply(list)
      

      选项 2

      pd.Series(df.T.to_dict('list'))
      

      两者都给你:

      a    [1, 2, 3, 4]
      b    [5, 6, 7, 8]
      dtype: object
      

      但是 选项 2 的扩展性更好。


      时间

      给定df

      更大的df

      from string import ascii_letters
      letters = list(ascii_letters)
      df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                        pd.MultiIndex.from_product([letters, letters]),
                        letters)
      

      df.T.apply(tuple).apply(list) 的结果是错误的,因为该解决方案不适用于 MultiIndex。

      【讨论】:

        【解决方案3】:

        数据框到列表的转换

        List_name =df_name.values.tolist()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-20
          • 1970-01-01
          • 2020-01-01
          • 1970-01-01
          • 2019-05-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多