【问题标题】:Two ways to join lists in dataframe: as rows and columns在数据框中加入列表的两种方法:作为行和列
【发布时间】:2015-09-07 17:39:11
【问题描述】:

我有两个列表:

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

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

import pandas as p
df1 = p.DataFrame(zip(l1,l2))
df1

我收到了 3 行 2 列的数据框(错过了 l2 的值 66)。它看起来与 ndarray 的定义相同,即:“如果将 ndarray 传递到数据帧中,所有列必须具有相同的行数”。但我不使用ndarray

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

df2 = p.DataFrame([l1,l2])

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

【问题讨论】:

标签: python numpy pandas dataframe


【解决方案1】:

函数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

【讨论】:

  • 当我在 Windows 上从命令提示符运行“pip install itertools”时,它显示“找不到满足要求的版本 itertools 没有为 itertools 找到匹配的发行版”。我有 Python 2.7。你知道如何解决这个错误吗?
  • itertools 包含在 python 标准库中。所以只需导入。
  • 它说 No module named stdlib (import stdlib as s)
  • import itertools 而不是标准库
  • 好的,谢谢。最后一件事。它说 TypeError: 'list' object is not callable.
【解决方案2】:

问题实际上在于您的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

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

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2020-11-13
    • 2019-01-02
    相关资源
    最近更新 更多