【问题标题】:Python Numpy ValueError: Must pass 2-d input. shape=(2, 2, 2)Python Numpy ValueError:必须通过二维输入。形状=(2, 2, 2)
【发布时间】:2021-08-09 03:33:31
【问题描述】:

这是我的 numpy 数组:

array([[['a','c'], [1,3]],

[['b','d'], [2, 4]]], dtype=object)

预期的数据框:

columns1 column2
['a','c'] [1, 3]
['b','d'] [2, 4]

收到此错误

ValueError: Must pass 2-d input. shape=(2, 2, 2)
 with `pd.DataFrame((c), columns=['q','s'])

【问题讨论】:

  • 你不明白什么?为什么它是一个 (2,2,2) 数组,或者为什么 pandas 有问题?

标签: python numpy


【解决方案1】:

问题是,您将 numpy 数组视为 2 x 2 矩阵,列表作为元素。但实际发生的是这些列表被转换为额外的维度。

我不知道是否有更直接的解决方案,但这里有一种方法可以将 numpy 引入所需的结构:

>>> c=numpy.array([[['a', 'c'], [1]], [['b', 'd'], [2,4]]])
>>> c
array([[list(['a', 'c']), list([1])],
       [list(['b', 'd']), list([2, 4])]], dtype=object)
>>> c[0,1].append(3)
>>> c
array([[list(['a', 'c']), list([1, 3])],
       [list(['b', 'd']), list([2, 4])]], dtype=object)
>>> pd.DataFrame(c, columns=['q','s'])
        q       s
0  [a, c]  [1, 3]
1  [b, d]  [2, 4]

在第一步中,其中一个内部列表具有不同的长度,因此 numpy 无法将其广播到具有 3 维的数组并返回您想要的以列表作为其元素的 2 维数组。接下来我只是简单地附加缺失值。

另一种方法是简单地跳过 numpy 数组并将列表列表的列表直接传递给 pandas:

>>> c=[[['a', 'c'], [1, 3]], [['b', 'd'], [2,4]]]
>>> pd.DataFrame(c, columns=['q','s'])
        q       s
0  [a, c]  [1, 3]
1  [b, d]  [2, 4]

【讨论】:

    【解决方案2】:

    编辑 2:

    import pandas as pd
    
    
    a = pd.Series([['a','c'],[1,3]])
    b = pd.Series([['b','d'],[2,4]])
    
    df = pd.DataFrame([a,b])
    
    print(df)
    
    

    编辑:不,你需要那些额外的括号,我的错。但如果你这样做,它会起作用:

    data = np.array([[['a,'c'], [1,3]],
    
    [['b','d'], [2, 4]]], dtype=object)
    
    df = pd.DataFrame(data[0])
    

    原文:

    我认为您可能有一组方括号太多,因此,它会看到三个维度,而不是您正在寻找的两个维度。

    你可以试试:

    np.array([['a,'c'], [1,3]],
    
    [['b','d'], [2, 4]], dtype=object)
    

    【讨论】:

    • 感谢您的帮助。但它没有返回我想要的输出。
    • 对不起,应该更仔细地阅读。我已经更新了产生您想要的输出的代码,但使用了pd.Series。这对你有用吗?
    猜你喜欢
    • 2021-08-14
    • 2022-01-25
    • 1970-01-01
    • 2021-11-07
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多