我有一個表,其中包含一個包含字典的列。在這個字典中,有一個鍵和一個字典值串列,如下所示:
| ID | dict_vals |
|---|---|
| 123 | {'key_a':[{'a':1,'b':8,'c':7},{'a':14,'b':6,'c':8},{'a' :9,'b':4,'c':9},...,{'a_t':67,'b_t':41,'c_t':6}]} |
| 345 | {'key_a':[{'a':5,'b':82,'c':72},{'a':4,'b':64,'c':81},{'a' :5,'b':3,'c':6},...{'a_t':34,'b_t':23,'c_t':}]} |
在嵌套的字典值串列中,所有鍵都是相同的,除了最后一個字典(例如,a_t、b_t...)。我想要做的是洗掉最后一個字典并將其他所有內容轉換為列,如下所示:
| ID | 一個 | b | C |
|---|---|---|---|
| 123 | 1 | 8 | 7 |
| 123 | 14 | 6 | 8 |
| 123 | 9 | 4 | 9 |
| 345 | 5 | 82 | 72 |
| 345 | 4 | 64 | 81 |
| 345 | 5 | 3 | 6 |
對于最后一個字典(例如,a_t、b_t),我已經能夠將它們分開并使用以下代碼進行轉換。
values = table.dict_vals.str.replace("'", '"').apply(json.loads).tolist()
df = pd.DataFrame(values)
df.key_a = df.key_a.apply(lambda x: x[-1])
data_split = df["dict_vals"].apply(pd.Series)
不幸的是,我不確定如何使用這種方法來分隔所有其他字典。任何幫助表示贊賞!謝謝!
uj5u.com熱心網友回復:
嘗試這個:
- 要洗掉最后一個元素,
list您可以list使用這樣的切片回傳[:-1]。 - 您可以從中提取資料幀
dict并pd.merge用于合并所有資料幀。 - 您可以
functools.reduce用于合并多個dfs。 - 您可以使用
pandas.applywithaxis=1并迭代每一行并從原始中找到 iddf并添加到 createddf。
from functools import reduce
import ast
df_res = reduce(lambda x, y: pd.merge(x, y, how='outer'),
df.apply(lambda x: pd.DataFrame(ast.literal_eval(x['dict_vals'])['key_a'][:-1]).assign(id=df['id'][x.name]), axis=1)).set_index('id')
print(df_res)
輸出:
a b c
id
123 1 8 7
123 14 6 8
123 9 4 9
345 5 82 72
345 4 64 81
345 5 3 6
輸入資料框:
df = pd.DataFrame({
'id' : [123, 345],
'dict_vals' : [{'key_a':[{'a':1,'b':8,'c':7},{'a':14,'b':6,'c':8},{'a':9,'b':4,'c':9}, {'a_t':67,'b_t':41,'c_t':6}]},
{'key_a':[{'a':5,'b':82,'c':72},{'a':4,'b':64,'c':81},{'a':5,'b':3,'c':6}, {'a_t':34,'b_t':23,'c_t':9}]}]
})
uj5u.com熱心網友回復:
首先添加資料
import pandas as pd
keys = [
{'key_a':[{'a':1,'b':8,'c':7},{'a':14,'b':6,'c':8},{'a':9,'b':4,'c':9},{'a_t':67,'b_t':41,'c_t':6}]},
{'key_a':[{'a':5,'b':82,'c':72},{'a':4,'b':64,'c':81},{'a':5,'b':3,'c':6}, {'a_t':34,'b_t':23,'c_t':2}]}
]
然后是一些變數。鍵串列中的每個鍵都應該有 1 個 id
ids = [123, 345]
id, a, b, c, = [], [], [], []
第一個 for 回圈是用于設定 dicts 的 id 的回圈。然后我們從串列中獲取 dict 作為 var values然后它分離 dict。
for idIndex in range(len(ids)):
values = keys[idIndex]["key_a"] # here is dict index of idIndex
for i in range(len(values) - 1): # here will drop last dict
value = values[i]
id.append(ids[idIndex]) # here your id
a.append(value["a"])
b.append(value["b"])
c.append(value["c"])
最后創建資料框
df = pd.DataFrame({"id":id, "a": a, "b": b, "c": c}) # create data frame
print(df)
輸出:
id a b c
0 123 1 8 7
1 123 14 6 8
2 123 9 4 9
3 345 5 82 72
4 345 4 64 81
5 345 5 3 6
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525702.html
標籤:Python熊猫字典
