将2个关系数据帧合并到嵌套的JSON / dataframe

时间:2018-03-28 15:04:50

标签: python json pandas csv dataframe

使用pandas加入数据帧时遇到了另一个问题。我想将一个完整的数据帧合并到另一个数据帧的列/字段中,其中DF2的外键字段与DF1的唯一键匹配。

输入数据是2个大致看起来像这样的CSV文件:

CSV 1 / DF 1:

cid;name;surname;address
1;Mueller;Hans;42553
2;Meier;Peter;42873
3;Schmidt;Micha;42567
4;Pauli;Ulli;98790
5;Dick;Franz;45632

CSV 2 / DF 1:

OID;ticketid;XID;message
1;9;1;fgsgfs
2;8;2;gdfg
3;7;3;gfsfgfg
4;6;4;fgsfdgfd
5;5;5;dgsgd
6;4;5;dfgsgdf
7;3;1;dfgdhfd
8;2;2;dfdghgdh

我希望DF2的每一行(其中XID与DF1的cid匹配)作为DF1中的单个字段。我的最终目标是将上面的输入文件转换为嵌套的JSON格式。

编辑1:

这样的事情:

    [
      {
        "cid": 1,
        "name": "Mueller",
        "surname": "Hans",
        "address": 42553,
        "ticket" :[{
                   "OID": 1,
                   "ticketid": 9,
                   "XID": 1,
                   "message": "fgsgfs"
                   }]
      },
    ...]

编辑2:

进一步的想法:是否可以在数据帧2中创建每行的字典,然后将此字典附加到数据帧1中的新列,其中字典的某些值(xid)与行中的唯一ID匹配(cid)?

我脑子里有一些伪代码:

Add new column "ticket" in DF1
Iterate over rows in DF2:
    row to dictionary
    iterate over DF1
        find row where cid = dict.XID
            append dictionary to field in "ticket"
convert DF1 to JSON

非Python解决方案也是可以接受的。

1 个答案:

答案 0 :(得分:0)

不确定您对输出的期望,但请检查merge

df1.merge(df2, left_on="cid", right_on="XID", how="left")

[基于预期输出的编辑]

也许是这样的:

(
    df1.merge(
        df2.groupby("XID").apply(lambda g: g.to_dict(orient="records")).reset_index(name="ticket"), 
        how="left", left_on="cid", right_on="XID")
    .drop(["XID"], axis=1)
    .to_json(orient="records")
)