![](/img/trans.png)
[英]Insert a pandas multi-index dataframe into another multi-index data frame at a particular location
[英]How to Insert a List of Data into Pandas Multi-Index Dataframe
如何將此數據列表插入到 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']
這是我正在處理的數據類型。
您需要將orgdata
在括號中並確保它的長度等於您擁有的列數,如下所示:
df = pd.DataFrame([orgdata], columns=cols)
創建MultiIndex
,您將orgdata
作為 25 個值的列表Shape of passed values is (1, 25)
(即Shape of passed values is (1, 25)
)。 然后,您將列表colnames
(我假設)定義為長度為 9 的字符串列表。然后您使用from_product()
和另一個包含 3 個值的列表創建您的MultiIndex
,因此給您的indices imply (27, 25)
。 這里的25
源於這樣一個事實,即您將orgdata
作為單個列表傳遞給數據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
調用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.