Как вставить список данных в мультииндексный фрейм данных Pandas - PullRequest
0 голосов
/ 27 августа 2018

Как мне вставить этот список данных в панду 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] ]

где 'data' - это другой список данных, из которого я анализирую конкретные данные.

У меня есть список имен столбцов, который также получен из списка «данных»

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)

Что я делаю не так? Документация, предоставленная онлайн, не дает много понимания этой темы.

Есть ли другие способы обойти это? Любая предоставленная помощь приветствуется.

Edit:

Сначала я составляю список «данных» из ответа на запрос, который я сделал. Вот пример данных, которые я получил из ответа.

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

Это данные, с которыми я работаю.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы звоните 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)
0 голосов
/ 27 августа 2018

Вам необходимо заключить orgdata в скобки и , чтобы убедиться, что его длина равна количеству столбцов, которые у вас есть, например:

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

Когда вы создаете MultiIndex, вы передаете orgdata в виде списка из 25 значений (т.е. Shape of passed values is (1, 25)). Затем вы определяете свой список colnames (я предполагаю) как список строк длиной 9. Затем вы создаете свой MultiIndex, используя from_product() с другим списком из 3 значений, поэтому вы получаете indices imply (27, 25). 25 здесь проистекает из того факта, что вы передаете orgdata в ваш конструктор dataframe как единый список, поэтому он попытается проанализировать каждое отдельное значение как его собственную строку. Вы должны заключить это в скобки, чтобы гарантировать, что каждое значение будет присвоено столбцу (поскольку каждый список в конструкторе интерпретируется как одна строка). Наконец, вам необходимо убедиться, что у вас есть 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
...