如何将数据列表插入Pandas多索引数据框

时间:2018-08-27 15:13:56

标签: python pandas web-scraping data-science

如何将此数据列表插入pandas DataFrame中?

orgdata = ['somestring', data[2], data[3], data[4], data[8], data[9], data[10], data[14], data[15], data[16], data[20], data[21], data[22], data[26], data[27], data[28], data[32], data[33], data[34], data[38], data[39], data[40], data[44], data[45], data[46] ]

其中“数据”是我要解析特定数据的另一个数据列表。

我有一个列名列表,该列名也从“数据”列表派生

colnames = ['USN', data[0], data[6], data[12], data[18], data[24], data[30], data[36], data[42]]

现在我需要在每列下有三个子列,所以我要这样做

cols = pd.MultiIndex.from_product([colnames, ['IA', 'EX', 'Total']])

但是当我尝试将“数据”列表插入这样的DataFrame中时

df = pd.DataFrame(orgdata, columns=cols)

我收到以下错误

ValueError: Wrong number of items passed 1, placement implies 27

我也收到此错误

ValueError: Shape of passed values is (1, 25), indices imply (27, 25)

我在做什么错?在线提供的文档并不能使您对该主题有太多的了解。

还有其他解决方法吗?感谢提供的任何帮助。

编辑:

首先,我从对请求的响应中列出“数据”列表。这是我从响应中收到的数据的一个实例。

data = ['15EC41', 'LIC', '40', '60', 'P']

这是我正在使用的数据。

2 个答案:

答案 0 :(得分:0)

您需要将orgdata放在方括号中,并且确保其长度等于所拥有的列数,如下所示:

df = pd.DataFrame([orgdata], columns=cols)

在创建MultiIndex时,您将orgdata作为25个值(即Shape of passed values is (1, 25))的列表进行传递。然后,您将列表colnames(假设为)定义为长度为9的字符串列表。然后使用MultiIndex和另外3个值列表来创建from_product()indices imply (27, 25)。这里的25源于您将orgdata作为单个列表传递给数据框构造函数的事实,因此它将尝试将每个值解析为自己的行。您需要将其包装在方括号中,以确保将每个值分配给一列(因为构造函数中的每个列表都被解释为单行)。最后,您需要确保拥有25列以匹配您传递的orgdata,或在27内部传递orgdata值。

使用示例数据,这是一个最小的示例:

import pandas as pd

data = ['15EC41', 'LIC', '40', '60', 'P']

orgdata = ['somestring', data[0], data[1], data[2], data[3], data[4]]

colnames = ['USN', data[2]]

cols = pd.MultiIndex.from_product([colnames, ['IA', 'EX', 'Total']])

df = pd.DataFrame([orgdata], columns=cols)

收益:

          USN                40          
           IA      EX Total  IA  EX Total
0  somestring  15EC41   LIC  40  60     P

设置索引的更复杂示例:

import pandas as pd

data1 = ['15EC41', 'LIC', '40', '60', 'P']
data2 = ['62F793', 'DUH', '52', '85', 'O']
data3 = ['9734HJ', 'IAS', '34', '94', 'D']

orgdata = [['somestring', i[0], i[1], i[2], i[3], i[4]] for i in [data1, data2, data3]]

colnames = [data1[0], data1[2]]

cols = pd.MultiIndex.from_product([colnames, ['IA', 'EX', 'Total']])

df = pd.DataFrame(orgdata, columns=cols)

USN = [0, 1, 2]

df.index = USN; df.index.name = 'USN'

收益:

         15EC41                40          
             IA      EX Total  IA  EX Total
USN                                        
0    somestring  15EC41   LIC  40  60     P
1    somestring  62F793   DUH  52  85     O
2    somestring  9734HJ   IAS  34  94     D

答案 1 :(得分:0)

您用DataFrame调用orgdata,它是25项=> df应该是25列。 columns参数仅指定数据标签。因此,不匹配columns实际上是27个项目。

您能否弄清楚您想如何“插入”数据(不仅是标签)?

我使用的最小示例:

import pandas as pd
data = range(50)
# 25 items
orgdata = ['somestring', data[2], data[3], data[4], data[8], data[9], data[10], data[14], data[15], data[16], data[20], data[21], data[22], data[26], data[27], data[28], data[32], data[33], data[34], data[38], data[39], data[40], data[44], data[45], data[46] ]
# 9 items
colnames = ['USN', data[0], data[6], data[12], data[18], data[24], data[30], data[36], data[42]]
#27 items
cols = pd.MultiIndex.from_product([colnames, ['IA', 'EX', 'Total']])
#giving error
df = pd.DataFrame(orgdata, columns=cols)