数据列表的隐式列表

时间:2019-07-15 16:08:01

标签: python pandas numpy

尽管我在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()

2 个答案:

答案 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) 根据需要提供输出数据框。 希望这会有所帮助!