尽管我在pandas
方面经验丰富,但我总是发现我错过了一些基本知识。
具体来说,我会执行以下操作:
data = [[1, 2, 3, 3, 4], [1, 1, 1, 2, 1], [5, 6, 7, 8, 9]]
data = np.array(data)
names = ['A', 'B', 'C']
df = pd.DataFrame(data=data, columns=names)
print(df)
然后出现以下错误:
ValueError: Shape of passed values is (3, 5), indices imply (3, 3)
我的问题是,这段代码可以与非nxn(行和列的数量不同)数组一样工作吗?
(我以这种方式问这个问题,因为我知道它适用于nxn数组)
或主要方法是创建一个字典,例如:
{'A': [1, 2, 3, 3, 4], 'B': [1, 1, 1, 2, 1],'C': [5, 6, 7, 8, 9]}
?
我遇到类似的错误,但是没有np.array()
。
答案 0 :(得分:3)
您可能需要添加T
df = pd.DataFrame(data=data.T, columns=names)
df
Out[509]:
A B C
0 1 1 5
1 2 1 6
2 3 1 7
3 3 2 8
4 4 1 9
答案 1 :(得分:1)
为了清楚起见,让我们一次浏览几行代码: 您正在创建列表列表:
data = [[1, 2, 3, 3, 4], [1, 1, 1, 2, 1], [5, 6, 7, 8, 9]]
data = np.array(data)
此数组的形状为(3,5),这表示该数组存储为3行5列。 所以在您的下一行中:
names = ['A', 'B', 'C']
df = pd.DataFrame(data=data, columns=names)
该数据帧是为3列(这是名称列表的长度)创建的,但是却显示为5列数据,因此触发了“值错误”。 尝试使用np.shape()函数创建熊猫数据框时,请始终检查多维数组的形状:
np.shape(data)
函数输出的第一个数字为您提供数据的行数,第二个数字为您提供二维数组中的列数。
上一个答案在哪个位置起作用:
df = pd.DataFrame(data=data.T, columns=names)
data.T所做的是转置数组的列和行。从而将阵列的形状从(3,5)翻转为(5,3),以便将其广播到数据帧。因此,数据框中的列数与翻转的数据框中的列数匹配,一切都很好。
您可以使用的另一种方法也可以回答有关创建字典的问题:使用字典理解,然后将字典转换为数据框:
new_dict={i:data[j] for j,i in enumerate(names)}
当我们需要同时使用索引和元素时,在遍历列表或数组时使用enumerate关键字。因此,在这里我持有“名称”的元素,而j持有“名称”中i的索引。 在这里,我们在一行中创建一个字典,每个名称A,B,C分别对应为:
{'A':[1、2、3、3、4],'B':[1、1、1、2、1],'C':[5、6、7、8、9 ]}
我们现在终于可以使用以下命令将此字典转换为数据框: df = pd.DataFrame(new_dict) 根据需要提供输出数据框。 希望这会有所帮助!