繁体   English   中英

将 Pandas 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM