[英]Create Pandas DataFrame from dictionary with list, tuple or dict as a single entry value
我有字典
data = { 'x' : 1,
'y' : [1,2,3],
'z' : (4,5,6),
'w' : {1:2, 3:4}
}
我想構建一個 Pandas DataFrame,這樣列表和元組就不會被廣播:
df = pd.DataFrame(some_transformation(data), index=['a'])
要得到
df =
x y z w
a 1 (1,2,3) (4,5,6) (1,2,3,4)
或者列表/元組/字典的某種扁平化和/或字符串化。 這樣做的最簡單/最有效的方法是什么,而不必深入每個字典條目的確切數據結構?
無需深入了解確切的數據結構,我認為實現您想要的最簡單方法是:
data={k:str(v) for k,v in data}
以上語句將使所有值都為字符串類型。 現在您可以使用以下行將數據字典轉換為數據框:
df=pd.DataFrame(data, index=[0])
這將為您提供以下形式的輸出:
w x y z
0 {1: 2, 3: 4} 1 [1, 2, 3] (4, 5, 6)
現在為您想要的輸出:(您可以使用其他有效的方法以及在數據框中的字符串替換)
for acol in df.columns:
a[acol]=a[acol].values[0].strip('[{()}]')
a[acol]=a[acol].values[0].replace(':', ',')
輸出看起來像
w x y z
1, 2, 3, 4 1 1, 2, 3 4, 5, 6
您不能對列表/元組和字典應用一種轉換。 它們具有非常不同的特性。 您可以展平所有字典,然后從更新的字典中創建一個pd.Series
。
for key in data:
if isinstance(data[key],dict):
data[key] = list(data[key].keys())+list(data[key].values())
pd.Series(data)
#w [1, 3, 2, 4]
#x 1
#y [1, 2, 3]
#z (4, 5, 6)
#dtype: object
如果需要,將其進一步轉換為 DataFrame:
df = pd.DataFrame(pd.Series(data)).T
# w x y z
#0 [1, 3, 2, 4] 1 [1, 2, 3] (4, 5, 6)
您可以以相同的精神處理列表(將它們轉換為元組)。
這是一種方式。
def transformer(data):
for k, v in data.items():
if isinstance(v, list):
data[k] = [tuple(v)]
elif isinstance(v, dict):
data[k] = [tuple(chain(*(v.items())))]
else:
data[k] = [v]
return data
df = pd.DataFrame(transformer(data), index=['a'])
# w x y z
# a (1, 2, 3, 4) 1 (1, 2, 3) (4, 5, 6)
您可以使用 set_value 將這些元素分配給 df,然后將 dict 和 list 轉換為元組。
df=pd.DataFrame(columns=data.keys())
[df.set_value(0,k,v) for k,v in data.items()]
df = df.applymap(lambda x: sum([[k,v] for k,v in x.items()],[]) if isinstance(x,dict) else x)
df = df.applymap(lambda x: tuple(x) if isinstance(x,list) else x)
Out[716]:
x y z w
0 1 (1, 2, 3) (4, 5, 6) (1, 2, 3, 4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.