【问题标题】:Convert numpy array to pandas dataframe将 numpy 数组转换为 pandas 数据框
【发布时间】:2020-06-20 13:50:00
【问题描述】:

我有一个大小为31x36 的numpy 数组,我想转换成pandas 数据框以便处理它。我正在尝试使用以下代码对其进行转换:

pd.DataFrame(data=matrix,
          index=np.array(range(1, 31)),
          columns=np.array(range(1, 36)))

但是,我收到以下错误:

ValueError: 传递值的形状是 (36, 31),索引意味着 (35, 30)

我怎样才能解决这个问题并正确转换它?

【问题讨论】:

  • pd.DataFrame(matrix) 会工作,不是吗?要使用自定义索引,这是另一种选择:pd.DataFrame(arr).rename(index=lambda x: x + 1, columns=lambda x: x + 1)

标签: python pandas numpy


【解决方案1】:

至于您尝试失败的原因,范围相差 1

pd.DataFrame(data=matrix,
          index=np.array(range(1, 32)),
          columns=np.array(range(1, 37)))

因为最后一个值不包含在范围内

实际上看看你正在做的事情,你本来可以做的:

pd.DataFrame(data=matrix,
          index=np.arange(1, 32)),
          columns=np.arange(1, 37)))

或者纯pandas

pd.DataFrame(data=matrix,
          index=pd.RangeIndex(range(1, 32)),
          columns=pd.RangeIndex(range(1, 37)))

此外,如果您不指定索引和列参数,则会生成一个自动生成的索引和列,该索引和列将从 0 开始。不清楚为什么你需要他们从1开始

你也可能没有传递索引和列参数,只是在构造后修改它们:

In[9]:
df = pd.DataFrame(adaption)
df.columns = df.columns+1
df.index = df.index + 1
df

Out[9]: 
          1         2         3         4         5         6
1 -2.219072 -1.637188  0.497752 -1.486244  1.702908  0.331697
2 -0.586996  0.040052  1.021568  0.783492 -1.263685 -0.192921
3 -0.605922  0.856685 -0.592779 -0.584826  1.196066  0.724332
4 -0.226160 -0.734373 -0.849138  0.776883 -0.160852  0.403073
5 -0.081573 -1.805827 -0.755215 -0.324553 -0.150827 -0.102148

【讨论】:

    【解决方案2】:

    除了上面的答案,range(1, X) 描述了从1X-1 的一组数字。你需要使用range(1, 32)range(1, 37) 来做你描述的事情。

    【讨论】:

      【解决方案3】:

      您遇到错误,因为range(start, end) 中的end 参数不包含。您有几个选项可以解决这个问题:

      不要传递索引和列

      只需使用df = pd.DataFrame(matrix)pd.DataFrame 构造函数隐式添加整数索引。

      传入数组的形状

      matrix.shape 给出了行数和列数的元组,因此您无需手动指定它们。例如:

      df = pd.DataFrame(matrix, index=range(matrix.shape[0]),
                                columns=range(matrix.shape[1]))
      

      如果需要从1开始,记得加1:

      df = pd.DataFrame(matrix, index=range(1, matrix.shape[0] + 1),
                                columns=range(1, matrix.shape[1] + 1))
      

      【讨论】:

      • 反对者愿意发表评论吗?直接使用matrix属性是这里的自然解决方案。
      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 2014-03-23
      • 2017-06-28
      • 2016-03-31
      • 2019-02-25
      • 2021-07-21
      相关资源
      最近更新 更多