我有两个清单:
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
有没有办法将列表作为列传递到数据框中,同时保存数据框中列表的所有值
答案 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
或者您可以将map
与None
一起使用。 (但是在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
此外,似乎每个列表中的第一个元素实际上是系列的标题,因此我冒昧地使用第一个元素作为系列名称。