在数据框中连接列表的两种方法:作为行和列

时间:2015-09-07 17:39:12

标签: python numpy pandas dataframe

我有两个清单:

Child.<Child>load()

现在我加入它们,以便每个列表成为数据框的一列:

l1 = ['0a',22,44]
l2 = ['0b',25,55,66]

我收到了包含3行和2列的数据框(错过import pandas as p df1 = p.DataFrame(zip(l1,l2)) df1 的值66)。它看起来与l2的定义相同,后者表示:“如果将ndarray传递到数据框”,则所有列必须具有相同的行数。但我不与ndarray合作!

但是,如果我将列表作为数据框的行加入,则Python会保存ndarray

66

有没有办法将列表作为列传递到数据框中,同时保存数据框中列表的所有值

2 个答案:

答案 0 :(得分:2)

函数zip返回列表,其长度截断为最短参数序列的长度。结果将是:

In [1]: zip(l1,l2)
Out[1]: [('0a', '0b'), (22, 25), (44, 55)]

为了节省价值66,请使用itertools中的izip_longest

In [3]: p.DataFrame(list(itertools.izip_longest(l1, l2)))
Out[3]:
      0   1
0    0a  0b
1    22  25
2    44  55
3  None  66

或者您可以将mapNone一起使用。 (但是在Python 3.x中更改了地图,因此仅适用于Python 2.x):

In [4]: p.DataFrame(map(None, l1, l2))
Out[4]:
      0   1
0    0a  0b
1    22  25
2    44  55
3  None  66

答案 1 :(得分:1)

问题实际上在于您的zip声明:

>>> zip(l1,l2)
[('0a', '0b'), (22, 25), (44, 55)]

您可以为每个列表创建一个系列,然后将它们连接起来以创建数据框。在这里,我使用字典理解来创建系列。 concat需要NDFrame对象,因此我首先从每个系列创建一个DataFrame。

series = {col_name: values 
          for col_name, values in zip([l1[0], l2[0]], 
                                      [l1[1:], l2[1:]])}

df = pd.concat([pd.DataFrame(s, columns=[col]) for col, s in series.iteritems()], axis=1)
>>> df
   0b  0a
0  25  22
1  55  44
2  66 NaN

此外,似乎每个列表中的第一个元素实际上是系列的标题,因此我冒昧地使用第一个元素作为系列名称。