将CSV加载到Pandas中,并基于列值转换为JSON层次结构

dm7nw8vv  于 2023-01-11  发布在  其他
关注(0)|答案(2)|浏览(150)

我有一个CSV,包含成千上万行,但基本上看起来像这样
| 个人标识|位置类型|位置_编号|
| - ------| - ------| - ------|
| 1个|"公司"|一百二十三|
| 第二章|'支|三二一|
| 1个|'支|四百五十六|
| 1个|'支|五六七|
目标是按personal_id及以下对所有内容进行分组,其中location_number有2个列表,由location_type标识

[
    {
        "personal_id": 1,
        "company": [123],
        "branch": [456, 567]
    },
    {
        "personal_id": 2,
        "branch": [321]
    }
]

我使用python panda是因为我以前做过一些成功的事情,但只是在1个过滤级别上,使用panda to_dict('records)在当时工作得很完美
我一直想在这种情况下做些事情,比如这样

merge_df= (data_df.groupby(['personal_id'])
    .apply(lambda x: x[['regulator', 'employee_number', 'sex', 'status']]
        .to_dict('records'))
    .reset_index()
    .rename(columns={0: 'employee'}))

但是我不知道如何在apply()中添加一个额外的过滤器,而且这个方法创建了一个列,在上面的场景中我不需要这个列,我将其重命名为"employee"
我唯一的其他选择是用C#重新开始一切,比如说CSVHelper,如果Pandas是错误的选择,也许还有自动Map器

vof42yt1

vof42yt11#

试试看:

df = df.pivot_table(
    index="personal_id", columns="location_type", values="location_number", aggfunc=list
)

out = [out.append(row[row.notna()].to_dict()) for _, row in df.reset_index().iterrows()]
print(out)

图纸:

[
    {"personal_id": 1, "branch": [456, 567], "company": [123]},
    {"personal_id": 2, "branch": [321]},
]
dddzy1tm

dddzy1tm2#

您可以执行以下操作:

# groupby personal_id and then in apply groupby and aggregate by list.
s = df.groupby("personal_id").apply(
    lambda x: x.groupby("location_type")["location_number"].agg(list).to_dict()
)
# then construct dict from series
out = [{**{"personal_dict": idx}, **v} for idx, v in zip(s.index, s)]

print(out)

[
    {"personal_dict": "1", "branch": [456, 567], "company": [123]},
    {"personal_dict": "2", "branch": [321]},
]

相关问题