代码之家  ›  专栏  ›  技术社区  ›  konstantin

将numpy数组转换为pandas数据帧

  •  5
  • konstantin  · 技术社区  · 7 年前

    我有一个核大小的数组 31x36 我想转换成pandas数据框来处理它。我正在尝试使用以下代码转换它:

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

    但是,我收到以下错误:

    值错误:传递值的形状为(36,31),索引表示(35,30)

    我怎样才能解决这个问题并适当地加以改造呢?

    3 回复  |  直到 7 年前
        1
  •  4
  •   EdChum Arthur G    7 年前

    至于你尝试的失败原因,范围缩小了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
  •  1
  •   ACascarino    7 年前

    除了上面的答案, range(1, X) 描述的数字集 1 高达 X-1 包容的。你需要使用 range(1, 32) range(1, 37) 照你说的做。

        3
  •  0
  •   jpp    7 年前

    你遇到了一个错误,因为 end 论证 range(start, 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))