![](/img/trans.png)
[英]Python / Pandas - Turning a list with inner dictionaries into a DataFrame
[英]Turning Pandas Dataframe into list of dictionaries
我有一個看起來像這樣的 DataFrame:
df = pd.DataFrame({"id": ["200"], "0": ["miner"], "1": ["miner, manager"], "2": ["mining, dude number 7"], "3": ["marshall"]})
我想把它變成一個字典列表,其中鍵為“id” ,在“value”上重復,每列的值split by ","
如果存在的話,看起來像 output:
list_dict_from_df = [{"id": "200", "value": [{"lower": "miner"}]}, {"id": "200", "value": [{"lower": "miner"}, {"lower": "manager"}]}, {"id": "200", "value": [{"lower": "mining"}, {"lower": "dude number 7"}]}, {"id": "200", "value": [{"lower": "marshall"}]}]
我目前正在循環中使用蠻力方法來執行此操作:
d_range = range(1, len(df.columns)
d_out = []
for i in d_range:
d_out.append({"id": code, "value": [{"lower": col} for col in df.iloc[:, i].str.split(',')]})
這讓我很接近:
d_out:
[{"id": 200, "value": [{"lower": ["miner"]}]}, {"id": 2000, "value": [{"lower": ["miner", "manager"]}]}]
但是,我不希望字符串“miner”包含在列表中,而是用“,”分隔,並且它們的元素每個都被帶入一個 id 值,如上所示。
如果可能的話,我更喜歡找到 DataFrame 解決方案(不是 iterrows() 類型)的非反模式......
嘗試:
from pprint import pprint
lst = []
for id_, g in df.groupby("id"):
for _, row in g.iterrows():
for cell in row["0":]:
lst.append(
{
"id": id_,
"value": [
{"lower": v} for v in map(str.strip, cell.split(","))
],
}
)
pprint(lst)
印刷:
[{'id': '200', 'value': [{'lower': 'miner'}]},
{'id': '200', 'value': [{'lower': 'miner'}, {'lower': 'manager'}]},
{'id': '200', 'value': [{'lower': 'mining'}, {'lower': 'dude number 7'}]},
{'id': '200', 'value': [{'lower': 'marshall'}]}]
這是重塑數據以使 id 為set_index
之后的一種方法,然后所有列都變為帶有stack
的行,並使用explode
得到一行str.split
后的逗號。 遍歷groupby
索引以獲得預期的 output
d = [{'id':i, 'value':vals.to_dict(orient='records')}
for (i, _), vals in df.set_index('id').stack()
.str.split(',').explode()
.to_frame(name='lower')
.groupby(level=[0,1])
]
d
[{'id': '200', 'value': [{'lower': 'miner'}]},
{'id': '200', 'value': [{'lower': 'miner'}, {'lower': ' manager'}]},
{'id': '200', 'value': [{'lower': 'mining'}, {'lower': ' dude number 7'}]},
{'id': '200', 'value': [{'lower': 'marshall'}]}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.