如何将系列列表传递给Pandas DataFrame?

时间:2012-11-30 20:54:36

标签: python pandas

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

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

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

6 个答案:

答案 0 :(得分:21)

您可以使用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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

只需将系列列表传递给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)

答案 3 :(得分:3)

建立系列列表:

master

第一种方法:

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([(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

答案 4 :(得分:2)

同时查看DataFrame.from_items

答案 5 :(得分:0)

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

df = pd.DataFrame()

然后:

df = df.append(list_series)

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

df.drop_duplicates(inplace=True)