将numpy数组转换为pandas数据框

13

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

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

然而,我收到了以下错误:

ValueError: 传递的值的形状是(36,31),索引暗示为(35,30)

我该如何解决这个问题并正确地进行转换?


pd.DataFrame(matrix) would work, no? To use custom index, this is another option: pd.DataFrame(arr).rename(index=lambda x: x + 1, columns=lambda x: x + 1) - cs95
3个回答

8
关于为什么你尝试的方法失败了,是因为范围偏离了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

5

您遇到了一个错误,因为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))

下投反对票的用户可以评论一下吗?直接使用“矩阵”属性是一个自然的解决方案。 - jpp

1
除了上面的答案之外,range(1, X) 描述了从 1X-1 (包括 X-1)的数字集合。你需要使用 range(1, 32)range(1, 37) 来完成你所描述的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接