【问题标题】:Create a pandas dataframe from a nested lists of unequal lengths从长度不等的嵌套列表创建熊猫数据框
【发布时间】:2018-03-07 23:37:54
【问题描述】:

所以我有一个列表如下:

aa = ['aa1', 'aa2', 'aa3', 'aa4', 'aa5']
bb = ['bb1', 'bb2', 'bb3', 'bb4']
cc = ['cc1', 'cc2', 'cc3']

然后将其创建为嵌套列表:

nest = [aa, bb, cc]

我想创建如下数据框:

aa   bb   cc
aa1  bb1  cc1
aa2  bb2  cc2
aa3  bb3  cc3
aa4  bb4  nan
aa5  nan  nan

我试过了:

pd.DataFrame(nest, columns=['aa', 'bb', cc'])

但是结果是这样的,每个列表都被写成一行(而不是一列)

【问题讨论】:

  • list(itertools.izip_longest(aa, bb, cc))

标签: python list pandas nested


【解决方案1】:

itertools 中的 zip_longest 函数执行以下操作:

>>> import itertools, pandas
>>> pandas.DataFrame((_ for _ in itertools.zip_longest(*nest)), columns=['aa', 'bb', 'cc'])
    aa    bb    cc
0  aa1   bb1   cc1
1  aa2   bb2   cc2
2  aa3   bb3   cc3
3  aa4   bb4  None
4  aa5  None  None

如果您有旧版本的 pandas,您可能需要将 zip_longest 包装在列表构造函数中。在较旧的 Python 上,您可能需要调用 izip_longest 而不是 zip_longest

【讨论】:

  • 我在等你发这个(-:
  • 对不起,这也不起作用。 module itertools has no attribute izip_longest。如果有帮助,我正在使用 Python 3 和熊猫版本 0.20.3
  • 我正在等待那些愚蠢的 Windows 10 更新之一 (84%),而 Mac 只有 python2.7 - 它在较新的 Python IINM 中被重命名为 zip_longest。
  • 等等,新版本的 pandas 将支持 data 参数的迭代器?
  • @juanpa.arrivillaga 为什么构造函数需要一个生成器而不是一个迭代器,这超出了我的理解。 issue[2193]
【解决方案2】:

选项 1

pd.DataFrame(nest, ['aa', 'bb', 'cc']).T

    aa    bb    cc
0  aa1   bb1   cc1
1  aa2   bb2   cc2
2  aa3   bb3   cc3
3  aa4   bb4  None
4  aa5  None  None

选项 2
自制zip_longest

f = lambda x, n: x[n] if n < len(x) else None
n, m = max(map(len, nest)), len(nest)

pd.DataFrame(
    [[f(j, i) for j in nest] for i in range(n)],
    columns=['aa', 'bb', 'cc']
)

    aa    bb    cc
0  aa1   bb1   cc1
1  aa2   bb2   cc2
2  aa3   bb3   cc3
3  aa4   bb4  None
4  aa5  None  None

【讨论】:

  • 抱歉,选项 1 似乎对我不起作用。 3 columns passed, passed data had 5 columns 是错误
  • 你用的是什么版本的熊猫? pd.__version__
  • 0.20.3是熊猫的版本
  • 顺便说一句,选项 2 也有效。不过看起来很复杂!
  • @Kvothe 我同意,我是 Paulo 的回答,我想在没有zip_longest 的情况下自己尝试一下。我仍然担心我的第一个选择不起作用。它应该有。我复制并粘贴了您的代码,然后运行了我的代码。我正在使用相同的版本。无论如何,你有一个很好的解决方案。
【解决方案3】:

或许

pd.DataFrame(data={'value':nest},index=['aa', 'bb', 'cc']).value.apply(pd.Series).T
Out[1297]: 
    aa   bb   cc
0  aa1  bb1  cc1
1  aa2  bb2  cc2
2  aa3  bb3  cc3
3  aa4  bb4  NaN
4  aa5  NaN  NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 2021-04-06
    • 2016-08-20
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多