[英]Create pd.DataFrame from dictionary with multi-dimensional array
我有以下字典:
dictA = {'A': [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
'B': [[4, 4, 4], [4, 4, 4],],
'C': [[4, 6, 0]]
}
我想將它轉換為pd.DataFrame()
,期待這個:
id ColA ColB ColC
0 1 4 4
1 2 4 6
2 3 4 0
3 1 4
4 2 4
5 3 4
6 1
7 2
8 3
我怎樣才能做到這一點? 我想
pd.DataFrame(dictAll.items(), columns=['ColA', 'ColB', 'ColC'])
但這顯然行不通!
方法如下:
import pandas as pd
import numpy as np
dictA = {'A': [[1, 2, 3], [1, 2, 3], [1, 2, 3]],
'B': [[4, 4, 4], [4, 4, 4],],
'C': [[4, 6, 0]]}
df = pd.DataFrame(dict([(f'Col{k}', pd.Series([a for b in v for a in b])) for k,v in dictA.items()])).replace(np.nan, '')
print(df)
輸出:
ColA ColB ColC
0 1 4 4
1 2 4 6
2 3 4 0
3 1 4
4 2 4
5 3 4
6 1
7 2
8 3
現在,讓我們一步一步地看一下這個問題。
我們可以嘗試的第一件事很簡單:
df = pd.DataFrame(dictA) print(df)
當然,這會返回此錯誤:
ValueError: arrays must all be same length
所以現在我們需要一種能夠從具有不同長度數組的dict
創建數據幀的方法。 為此,我們可以:
df = pd.DataFrame(dict([(k, pd.Series(v)) for k, v in dictA.items()])) print(df)
輸出:
ABC 0 [1, 2, 3] [4, 4, 4] [4, 6, 0] 1 [1, 2, 3] [4, 4, 4] NaN 2 [1, 2, 3] NaN NaN
我們希望數據框是垂直的,因此對於每次迭代,使用列表理解將列表展平:
df = pd.DataFrame(dict([(k, pd.Series([a for b in v for a in b])) for k, v in dictA.items()])) print(df)
輸出:
ABC 0 1 4.0 4.0 1 2 4.0 6.0 2 3 4.0 0.0 3 1 4.0 NaN 4 2 4.0 NaN 5 3 4.0 NaN 6 1 NaN NaN 7 2 NaN NaN 8 3 NaN NaN
現在我們想用空格替換所有的NaN
。 為此,我們需要import numpy as np
,然后執行:
df = pd.DataFrame(dict([(k, pd.Series([a for b in v for a in b])) for k, v in dictA.items()])).replace(np.nan, '') print(df)
輸出:
ABC 0 1 4 4 1 2 4 6 2 3 4 0 3 1 4 4 2 4 5 3 4 6 1 7 2 8 3
最后使用格式化字符串將字母轉換為"Col"
字母:
df = pd.DataFrame(dict([(f'Col{k}', pd.Series([a for b in v for a in b])) for k,v in dictA.items()])).replace(np.nan, '') print(df)
輸出:
ColA ColB ColC 0 1 4 4 1 2 4 6 2 3 4 0 3 1 4 4 2 4 5 3 4 6 1 7 2 8 3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.