【问题标题】:How do I Pass a List of Series to a Pandas DataFrame?如何将系列列表传递给 Pandas DataFrame?
【发布时间】:2012-11-19 03:14:21
【问题描述】:

我意识到 Dataframe 需要一张 {'series_name':Series(data, index)} 的地图。但是,即使地图是 OrderedDict(),它也会自动对该地图进行排序。

有没有一种简单的方法来传递 Series(data, index, name=name) 列表,以便保留顺序并且列名是 series.name?如果所有系列的所有索引都相同,是否有一种简单的方法?

我通常通过传递一个 numpy column_stack 的 series.values 并指定列名来做到这一点。然而,这很难看,在这种特殊情况下,数据是字符串而不是浮点数。

【问题讨论】:

  • 好的,所以字符串实际上可以在 numpy 数组中工作,我有一个解决方案。仍然感觉有点像黑客,我想知道是否有一个干净的解决方案。

标签: python pandas


【解决方案1】:

你可以使用pandas.concat:

import pandas as pd
from pandas.util.testing import rands

data = [pd.Series([rands(4) for j in range(6)],
                  index=pd.date_range('1/1/2000', periods=6),
                  name='col'+str(i)) for i in range(4)]

df = pd.concat(data, axis=1, keys=[s.name for s in data])
print(df)

产量

            col0  col1  col2  col3
2000-01-01  GqcN  Lwlj  Km7b  XfaA
2000-01-02  lhNC  nlSm  jCYu  XLVb
2000-01-03  sSRz  PFby  C1o5  0BJe
2000-01-04  khZb  Ny9p  crUY  LNmc
2000-01-05  hmLp  4rVp  xF2P  OmD9
2000-01-06  giah  psQb  T5RJ  oLSh

【讨论】:

    【解决方案2】:
    a = pd.Series(data=[1,2,3])
    b = pd.Series(data=[4,5,6])
    a.name = 'a'
    b.name= 'b'
    
    pd.DataFrame(zip(a,b), columns=[a.name, b.name])
    

    或者只是连接数据帧

    pd.concat([pd.DataFrame(a),pd.DataFrame(b)], axis=1)
    
    In [53]: %timeit pd.DataFrame(zip(a,b), columns=[a.name, b.name])
    1000 loops, best of 3: 362 us per loop
    
    In [54]: %timeit pd.concat([pd.DataFrame(a),pd.DataFrame(b)], axis=1)
    1000 loops, best of 3: 808 us per loop
    

    【讨论】:

    • 如果索引/数据的长度相同,压缩会更快吗?
    【解决方案3】:

    也请查看DataFrame.from_items

    【讨论】:

    • DataFrame.from_items 在此示例中如何工作?
    • DataFrame.from_items([<Series1>, <Series2>, ...])
    • 哎呀,我的意思是:DataFrame.from_items([('column1', <Series1>), ('column2', <Series2>), ...])
    • from_items deprecation... 使用 from_dict: pd.DataFrame.from_dict({'column1':mylist})
    【解决方案4】:

    只需将系列列表传递给DataFrame,然后转置似乎也可以。它还将填充一个或另一个系列中缺少的任何索引。

    import pandas as pd
    from pandas.util.testing import rands
    data = [pd.Series([rands(4) for j in range(6)],
                      index=pd.date_range('1/1/2000', periods=6),
                      name='col'+str(i)) for i in range(4)]
    df = pd.DataFrame(data).T
    print(df)
    

    【讨论】:

    • 最后.T 的问题是它破坏了数据类型
    • pd.DataFrame(list_of_series) 是完美的
    【解决方案5】:

    建立系列列表:

    import pandas as pd
    import numpy as np
    
    > series = [pd.Series(np.random.rand(3), name=c) for c in list('abcdefg')]
    

    第一种方法 pd.DataFrame.from_items:

    > pd.DataFrame.from_items([(s.name, s) for s in series])
              a         b         c         d         e         f         g
    0  0.071094  0.077545  0.299540  0.377555  0.751840  0.879995  0.933399
    1  0.538251  0.066780  0.415607  0.796059  0.718893  0.679950  0.502138
    2  0.096001  0.680868  0.883778  0.210488  0.642578  0.023881  0.250317
    

    第二种方法 pd.concat:

    > pd.concat(series, axis=1)
              a         b         c         d         e         f         g
    0  0.071094  0.077545  0.299540  0.377555  0.751840  0.879995  0.933399
    1  0.538251  0.066780  0.415607  0.796059  0.718893  0.679950  0.502138
    2  0.096001  0.680868  0.883778  0.210488  0.642578  0.023881  0.250317
    

    【讨论】:

      【解决方案6】:

      您可以先创建一个空的DataFrame,然后使用append()

      df = pd.DataFrame()
      

      然后:

      df = df.append(list_series)
      

      我还想确保之前创建 list_series 的脚本不会弄乱我的数据框:

      df.drop_duplicates(inplace=True)
      

      【讨论】:

        【解决方案7】:

        这个比较简单:

        import pandas as pd
        from pandas.util.testing import rands
            
        data = [pd.Series([rands(4) for j in range(6)],
                          index=pd.date_range('1/1/2000', periods=6),
                          name='col'+str(i)) for i in range(4)]
            
        df = pd.DataFrame(data)
        print(df)
        

        产生

             2000-01-01 2000-01-02 2000-01-03 2000-01-04 2000-01-05 2000-01-06
        col0       oPg5       9Af9       SNfq       vnCb       ArCU       8Bhy
        col1       IKmX       xS0c       yqCQ       sVov       92CN       WIyH
        col2       1x2s       JBk7       Z5vh       km7k       ed1F       pIDt
        col3       m9M3       mxil       1v72       Fkme       YooA       5H5b
        

        ,或者试试这个

        df = pd.DataFrame(data).T
        print(df)
        

        屈服

                    col0  col1  col2  col3
        2000-01-01  6zbm  UfrI  isNy  wVv0
        2000-01-02  Kgej  0SN4  thDS  7BP2
        2000-01-03  mcTx  BGDI  5BJC  mUdg
        2000-01-04  iVSP  6Rim  6gg9  fY2A
        2000-01-05  HzEU  giJ6  HFD1  dE98
        2000-01-06  wYCi  nWmp  jqLz  GwKz
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-15
          • 2019-11-28
          • 2020-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多