【问题标题】:How to efficently flatten JSON structure returned in elasticsearch_dsl queries?如何有效地展平在 elasticsearch dsl 查询中返回的 JSON 结构?
【发布时间】:2020-04-24 02:59:30
【问题描述】:

我正在使用 elasticsearch_dsl 对 elasticsearch 数据库进行查询和搜索。

我要查询的字段之一是地址,其结构如下:

address.first_line
address.second_line
address.city
adress.code

返回的文档将其保存在 JSON 结构中,因此地址保存在一个字典中,其中每个地址子字段都有一个字段。

我想把它放到一个(熊猫)数据框中,这样地址的每个子字段就有一列。

直接将地址放入数据框中会给我一列地址字典,并迭代行以手动解包 (json.normalize()) 每个地址字典需要很长时间(4 天,约 200,000 行)。

从文档中我无法弄清楚如何让 elasticsearch_dsl 返回扁平化结果。有没有更快的方法来做到这一点?

【问题讨论】:

  • 您是否尝试过将Series(列)转换为列表并直接传递给DataFrame 构造函数..?即类似pd.DataFrame(df['address].tolist()) ...
  • 你能举一个来自 elasticsearch 的 JSON 的简短例子吗?
  • 嗨@chrisa,我发现它没有生成可以连接到原始数据框的数据框,但我找到了一个类似的解决方案,如下所示。

标签: pandas dataframe flatten elasticsearch-dsl elasticsearch-dsl-py


【解决方案1】:

正在寻找解决这个问题的方法,遇到了自己的答案,发现缺少,所以会用更好的方法更新

具体:pd.json_normalize(df['json_column'])

上下文:pd.concat([df, pd.json_normalize(df['json_column'])], axis=1)

然后根据需要删除原始列。

去年做同样事情的原始答案要慢得多

df.column_of_dicts.apply(pd.Series) 返回一个 DataFrame,其中的 dicts 被展平。

pd.concat(df,new_df) 将新列添加到旧数据帧中。

然后删除原来的column_of_dicts。

pd.concat([df, df.address.apply(pd.Series)], axis=1) 是我使用的实际代码。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2022-09-27
    • 2018-04-15
    • 1970-01-01
    • 2018-12-01
    • 2015-06-16
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多