【问题标题】:How to concatenate multiple json columns in panda如何在熊猫中连接多个json列
【发布时间】:2022-10-12 21:49:50
【问题描述】:

我有一个格式如下的 df:

id json_1 json_2 json_3 
1  {a:b}  {a:c}  {c:d}
2  {a:b}  {b:c}  null
3  {a:c}  {c:d}  {a:g}

我想创建一个连接(即联合)json_1、json_2 和 json_3 列的新列。

json_1、json_2 和 json_3 是字典文本。

期望的输出:

 id json_1 json_2 json_3 final_json
 1  {a:b}  {a:c}  {c:d}   [{a:b}, {a:c}, {c:d}]
 2  {a:b}  {b:c}  null    [{a:b}, {b:c}]
 3  {a:c}  {c:d}  {a:g}   [{a:c}, {c:d}, {a:g}] 

【问题讨论】:

  • 嗯,{{a:b}, {a:c}, {c:d}} 无效,需要列表吗?
  • 不确定我是否理解正确,但似乎这应该可以解决您的问题df['final_json'] = df[['json_1', 'json_2', 'json_3']].apply(lambda x: set(x) - set(['null']), axis=1)(这里假设数据框名称是df)。让我知道这是否可行
  • “json”不是python也不是pandas数据类型,你是什么实际上每个单元格都有?字典、文本或其他东西?
  • 对困惑感到抱歉。我修改了问题。输入是每列中的字典文本。我需要的输出是一个 json 文件。

标签: python json pandas dataframe concatenation


【解决方案1】:

根据数据类型和其他要求,这应该可以完成工作

df['final_json'] = df[['json_1', 'json_2', 'json_3']].apply(lambda x: set(x) - set(['null']), axis=1)

[Out]:
   id json_1 json_2 json_3             final_json
0   1  {a:b}  {a:c}  {c:d}  {{c:d}, {a:c}, {a:b}}
1   2  {a:b}  {b:c}   null         {{b:c}, {a:b}}
2   3  {a:c}  {c:d}  {a:g}  {{a:g}, {c:d}, {a:c}}

根据 OP 的new Edit,如果目标只是获得所需的输出,假设一个是从前一个操作开始,那么可以通过各种方法来实现,例如:

  • 使用js.dumps()

    import json as js
    
    df['final_json'] = df['final_json'].apply(lambda x: js.dumps(x))
    
  • 使用list()

    df['final_json'] = df['final_json'].apply(lambda x: list(x))
    
  • 使用str()

    df['final_json'] = df['final_json'].apply(lambda x: str(x))
    

他们都给出了以下数据框

   id json_1 json_2 json_3                   final_json
0   1  {a:b}  {a:c}  {c:d}  ["{c:d}", "{a:c}", "{a:b}"]
1   2  {a:b}  {b:c}   null           ["{b:c}", "{a:b}"]
2   3  {a:c}  {c:d}  {a:g}  ["{a:g}", "{c:d}", "{a:c}"]

这将是选择更适合 OP 用例的方法的问题,并指出可能还有其他方法可以做到这一点。


作为替代方案,这是一个单行,它将为 OP 提供与更新后的所需输出相同的输出,但是从问题中的 OP 数据框开始

df['final_json'] = df[['json_1', 'json_2', 'json_3']].apply(lambda x: [i for i in x if i != 'null'], axis=1)

[Out]:
   id json_1 json_2 json_3             final_json
0   1  {a:b}  {a:c}  {c:d}  [{a:b}, {a:c}, {c:d}]
1   2  {a:b}  {b:c}   null         [{a:b}, {b:c}]
2   3  {a:c}  {c:d}  {a:g}  [{a:c}, {c:d}, {a:g}]

如果列可以包含 NaN 的值,则可以考虑以下任一操作 (or jezrael's answer)

df['final_json'] = df[['json_1', 'json_2', 'json_3']].apply(lambda x: [i for i in x if i != 'null' and i != np.nan], axis=1)

【讨论】:

    【解决方案2】:

    如果需要过滤掉缺失值并加入字典,请使用pd.notna 的列表理解:

    如果需要使用json 子字符串过滤列:

    df['final_json'] = df.filter(like='json').apply(lambda x: [y for y in x if pd.notna(y)], axis=1)
    

    如果需要按列表过滤列:

    df['final_json'] = df[['json_1', 'json_2', 'json_3']].apply(lambda x: [y for y in x if pd.notna(y)], axis=1)
    

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 2019-04-12
      • 2022-10-06
      • 2021-09-28
      相关资源
      最近更新 更多