簡體   English   中英

合並幾個 json 為 Python 中的每個值選擇奇數

[英]Merge several json picking the odd one for each value in Python

我目前有 N 個 json 個輸入文件,它們都具有相同的結構,但其中每個文件的 N - 1 個值都定義為“無”。 我想將它們合並到一個 json 中,就像 git 合並/補丁一樣,它總是選擇設置值(即與“無”不同的值)。 這是一個例子(虛構的):

json 1: {'a': 'aaa', ['b': 'None', 'c': 'None']}
json 2: {'a': 'None', ['b': 'bbb', 'c': 'None']}
json 3: {'a': 'None', ['b': 'None', 'c': 'ccc']}

預期結果:{'a': 'aaa', ['b': 'bbb', 'c': 'ccc']}

Atm,我正在考慮對所有輸入文件使用 zip,迭代每個單詞並選擇任何不是“無”的內容來組成 output 文件。 但是,我認為必須有一種我現在還沒有看到的更清潔的方法。提前致謝!

您的 json 文件的格式現在不正確。 您應該驗證這一點並相應地更新代碼。 截至目前,我已將您的 json 轉換為以下格式:

json_1 = {"a": "aaa", "b": "None", "c": "None"}
json_2 = {"a": "None", "b": "bbb", "c": "None"}
json_3 = {"a": "None", "b": "None", "c": "ccc"}

如果數據在文件中,可以使用下面的function:

import json

f = open ('data.json', "r")
json.load(f.read())

如果數據是字符串格式,你可以使用:

import json

json_1 = json.loads('{"a": "aaa", "b": "None", "c": "None"}')
json_2 = json.loads('{"a": "None", "b": "bbb", "c": "None"}')
json_3 = json.loads('{"a": "None", "b": "None", "c": "ccc"}')

至於解決方案,遍歷 json 個文件將是最好的選擇。 解決該問題的另一種方法是預先清除所有包含“None”的鍵,然后將它們合並為一個。 相同的相同代碼是:

json_clean_1 = {k: v for k, v in json_1.items() if v != "None"}
json_clean_2 = {k: v for k, v in json_2.items() if v != "None"}
json_clean_3 = {k: v for k, v in json_3.items() if v != "None"}

output_json = dict(list(json_clean_1.items()) + list(json_clean_2.items()) + list(json_clean_3.items()))
print(output_json)

根據評論,您可以使用與此類似的解決方案。 它應該給你一個 output dataframe 和一個包含組合值的列:

import os
import json
import pandas as pd

# get files
json_files = [
    each_file for each_file in os.listdir(".") if each_file.endswith('.json')
]

# read files
dfs = []
for file in json_files:
    with open(file) as f:
        json_data = pd.json_normalize(json.loads(f.read()))
    dfs.append(json_data)

# combine and clean df
combined_df = pd.concat(dfs, ignore_index=True)
cleaned_df = combined_df.replace("None", pd.NA).transpose()

# df with required column
cleaned_df['combined_col'] = cleaned_df[cleaned_df.columns].apply(
    lambda x: ','.join(x.dropna().astype(str)), axis=1)
print(cleaned_df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM