[英]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.