私の全体的な目標は、Excelファイルからの入力をテキストファイル(Stata .doファイル)に変換して、ほぼ同じ構造を持つが、データの特異な性質のために個別の処理を必要とする一連のデータ調和タスクを実行することです(全国調査)。調和はさまざまな人によって実行され、Excelは人々が同じ構造を使用することを保証します。私の戦略は、ExcelファイルをJSON構造で読み取り、この構造を使用してdoファイルに書き込むことです。
私が今解決しようとしている問題は、JSONがExcelから読み取るときにJSONの列構造から階層構造に移行する方法です。ユーザーに持たせたいExcelファイルは、ブロックとブロック内のタスクの構造を持ち、タスクを実行するために必要な特定のコマンド(1行以上)があります。以下の画像は、Excelドキュメントの例です。
最終的な目標は、次のようなテキストファイルを作成することです。
* A
* A1
Command for A1
* A2
Command for A2 (1)
Command for A2 (2)
* B
* B1
Command for B1 (1)
Command for B1 (2)
Command for B1 (3)
*B2
Command for B2 (1)
Command for B2 (2)
私はPythonを使用して、次のコードを使用してこれを読み取ります。
path = "Some Path/test.xlsx"
import pandas
import json
x = pandas.read_excel(path, sheet_name='Sheet')
json_str = x.to_json()
前述のように、これによりJSONの列構造が生成されます。これは次のようになります。
私が苦労しているのは、これをコードが自然に持つ階層構造に変換することです。私の希望する出力は、次の形式のJSONオブジェクトです。
全体的な目標を達成するためのよりスマートな方法があれば、それを知ってうれしいですが、この翻訳は情報を構造化するために必要なステップだと思いました。
再現性のためにJSONオブジェクトを生成するコードは次のとおりです
# Column-wise object
'{"Block":{"0":"* A","1":null,"2":null,"3":null,"4":null,"5":null,"6":"* B","7":null,"8":null,"9":null,"10":null,"11":null},"Task":{"0":"* A1","1":null,"2":null,"3":"* A2","4":null,"5":null,"6":"* B1","7":null,"8":null,"9":null,"10":"*B2","11":null},"Code":{"0":"Command for A1","1":null,"2":null,"3":"Command for A2 (1)","4":"Command for A2 (2)","5":null,"6":"Command for B1 (1)","7":"Command for B1 (2)","8":"Command for B1 (3)","9":null,"10":"Command for B2 (1)","11":"Command for B2 (2)"}}'
# Hierarchical object
'{"* A": {"* A1": ["Command for A1"], "* A2": ["Command for A2 (1)", "Command for A2 (2)"] }, "* B" : {"* B1" : ["Command for B1 (1)", "Command for B1 (2)", "Command for B1 (3)"], "* B2" : ["Command for B2 (1)", "Command for B2 (2)"]}}'
あなたはこのようにそれを行うことができます:
import pandas as pd
import json
from collections import defaultdict
path = "Some Path/test.xlsx"
df = pd.read_excel(path,
engine='openpyxl',
# header=None, names=['Block', 'Task', 'Code'] # only if your file has no headers
)
df.dropna(inplace=True, axis=0, how='all')
df.fillna(method='ffill', inplace=True, axis=0)
df = df.set_index(['Block', 'Task'])
nested_dict = defaultdict(lambda : defaultdict(list))
for keys, value in df.Code.iteritems():
nested_dict[keys[0]][keys[1]].append(value)
json_str = json.dumps(nested_dict, indent=4, sort_keys=True)
print(json_str)
出力:
{
"* A": {
"* A1": [
"Command for A1"
],
"* A2": [
"Command for A2 (1)",
"Command for A2 (2)"
]
},
"* B": {
"* B1": [
"Command for B1 (1)",
"Command for B1 (2)",
"Command for B1 (3)"
],
"* B2": [
"Command for B2 (1)",
"Command for B2 (2)"
]
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加