【问题标题】:How to Insert a List of Data into Pandas Multi-Index Dataframe如何将数据列表插入 Pandas 多索引数据框
【发布时间】:2018-08-27 15:13:56
【问题描述】:

如何将此数据列表插入到 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']

这是我正在处理的数据。

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?最少,data 只需要 3-5 个值。我们中的许多人都希望确定我们正在解决您的确切问题,这是我们可以确定的唯一方法。
  • 抱歉,您为data 提供的值与文本不兼容...
  • 很抱歉没有明确数据列表@Lorenz

标签: python pandas web-scraping data-science


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 它现在可以工作了,我明白了我在 'orgdata' 中传递的参数数量不正确。我只想从第二列开始有 3 个子列,因此我传递了 25 个而不是 27 个参数。我通过从列表中删除 'somedata' 并删除列名 'USN' 解决了这个问题。我现在必须考虑其他方法将一列“USN”作为索引附加到 DataFrame。
  • 您可以使用df.index = ________设置您的索引
  • 是的。 df = df.set_index('USN') 假设 'USN'df 中的一列。如果这有帮助,请随时投票/接受我的回答!
  • 这就是问题所在,我不能将“USN”作为一列,因为如果这样做,我需要在“USN”下有三个子列(这是不希望的)。是否可以在多索引时排除列以避免此问题?
  • 哦,我明白了。是的,只需将“USN”排除为一列,然后在上面查看我的编辑。
【解决方案2】:

您使用orgdata 调用DataFrame,这是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)

【讨论】:

  • 如果列数匹配,df.Dataframe(orgdata, columns= cols) 不会自动在指定标签处插入数据吗?
  • 我绝对认为@rahlf23 的回答证明了这一点(但您需要将orgdata 包装在[] 中)。我误解了您对“插入”的使用,认为您想添加其他数据。
  • 关于这一点,我如何能够在不将当前内容擦除到下一个索引的情况下将数据插入 DataFrame?我需要这个,因为我正在向网页发出多个请求,并且每次输出的数据都不同,并且必须插入/附加到 DataFrame。
猜你喜欢
  • 2015-06-12
  • 2022-06-29
  • 2018-04-19
  • 2021-02-07
  • 2020-10-22
  • 2019-06-24
  • 2018-12-06
  • 2021-04-21
  • 2018-02-27
相关资源
最近更新 更多