ホームページ >バックエンド開発 >Python チュートリアル >Python では、数秒で Dataframe に変換するネストされた JSON が導入されました。

Python では、数秒で Dataframe に変換するネストされた JSON が導入されました。

coldplay.xixi
coldplay.xixiオリジナル
2020-12-29 09:34:393510ブラウズ

Python チュートリアルこのコラムでは、JSON をネストする方法を紹介します

Python では、数秒で Dataframe に変換するネストされた JSON が導入されました。

推奨 (無料): ##Python チュートリアル

API を呼び出すと、 を使用すると、ドキュメント データベースはネストされた JSON オブジェクトを返します。 Python がネストされた構造内のキーを列に変換しようとすると、pandas にロードされたデータは、多くの場合次の結果を取得します:

df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])
説明: ここでの結果は非常に大きくなります。 Dictionary , issues は結果のキーであり、issues の値はネストされた JSON オブジェクト ディクショナリのリストです。JSON のネストされた構造については後で説明します。
問題は、API がネストされた

JSON 構造を返し、注目するキーが実際にオブジェクト内の異なるレベルにあることです。

ネストされた

JSON 構造は次のようになります。

私たちが望んでいるのは次のとおりです。

以下では、API によって返されるデータを例として取り上げます。API には通常、フィールドに関するメタデータが含まれています。これらが必要なフィールドであるとしましょう。

    key: JSON キー、第 1 レベル。
  • summary: 第 2 レベルの「フィールド」オブジェクト。
  • ステータス名: 第 3 レベルのポジション。
  • statusカテゴリ名: 4 番目の入れ子レベルにあります。
上記のように、抽出することを選択したフィールドは、課題リストの

JSON 構造内の 4 つの異なるネスト レベルに順番にあります。

{
  "expand": "schema,names",
  "issues": [
    {
      "fields": {
        "issuetype": {
          "avatarId": 10300,
          "description": "",
          "id": "10005",
          "name": "New Feature",
          "subtask": False
        },
        "status": {
          "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.",
          "id": "5",
          "name": "Resolved",
          "statusCategory": {
            "colorName": "green",
            "id": 3,
            "key": "done",
            "name": "Done",
          }
        },
        "summary": "Recovered data collection Defraglar $MFT problem"
      },
      "id": "11861",
      "key": "CAE-160",
    },
    {
      "fields": { 
... more issues],
  "maxResults": 5,
  "startAt": 0,
  "total": 160
}
#あまり良い解決策ではありません

1 つのオプションは、直接コーディングして特定のフィールドを検索する関数を記述することですが、問題は、各埋め込みフィールドをこの関数を呼び出してフィールドを設定し、

DataFrame

の新しい列に対して .apply を呼び出します。 必要なフィールドをいくつか取得するために、まず列のフィールド キーのオブジェクトを抽出します。

df = (
    df["fields"]
    .apply(pd.Series)
    .merge(df, left_index=True, right_index = True)
)

上の表からわかるように、利用できるのは概要のみです。 issuetype、status など。ネストされたオブジェクトにまだ埋もれています。

以下は issuetype の名前を抽出するメソッドです。

# 提取issue type的name到一个新列叫"issue_type"
df_issue_type = (
    df["issuetype"]
    .apply(pd.Series)
    .rename(columns={"name": "issue_type_name"})["issue_type_name"]
)
df = df.assign(issue_type_name = df_issue_type)

上記と同様、ネスト レベルが多すぎる場合は、再帰を自分で実装する必要があります。これは、ネストの各レベルで上記のようなメソッドを呼び出して解析し、新しい列に追加する必要があるためです。

プログラミングの基礎が弱い友達にとって、プログラミングの基礎を学ぶのは実はかなり面倒で、特にデータアナリストにとっては、データを活用したいと考えたとき、分析用の構造化データを早く入手したいと考えます。

現在、Dong 兄弟は

pandas

組み込みソリューションを共有しています。

組み込みソリューション

pandas

には、.json_normalize という素晴らしい組み込み関数があります。

pandas

のドキュメントには、半構造化された JSON データをフラット テーブルに正規化することが記載されています。 前のソリューションのすべてのコードは、この組み込み関数を使用してわずか 3 行で完了できます。手順は非常に簡単で、次の使用法を理解するだけです。

必要なフィールドを決定し、. 記号を使用してネストされたオブジェクトを接続します。

処理したいネストされたリスト (ここでは

results["issues"]

) をパラメーターとして .json_normalize に入力します。 定義した FIELDS リストをフィルタリングします。

FIELDS = ["key", "fields.summary", "fields.issuetype.name", "fields.status.name", "fields.status.statusCategory.name"]
df = pd.json_normalize(results["issues"])
df[FIELDS]

はい、とても簡単です。

その他の操作

レコード パス

results["issues"]## を渡すことに加えて、上 #リストに加えて、

record_path パラメータを使用して、JSON オブジェクト内のリストのパスを指定します。

# 使用路径而不是直接用results["issues"]
pd.json_normalize(results, record_path="issues")[FIELDS]
カスタム区切り文字

sep パラメータを使用して、ネスト構造接続の区切り文字をカスタマイズすることもできます。たとえば、デフォルトの「.」を「-」に置き換えます。下に 。

### 用 "-" 替换默认的 "."
FIELDS = ["key", "fields-summary", "fields-issuetype-name", "fields-status-name", "fields-status-statusCategory-name"]
pd.json_normalize(results["issues"], sep = "-")[FIELDS]

再帰の制御

各サブオブジェクトを再帰したくない場合は、max_level

パラメーターを使用して、深さ。この場合、

statusCategory.name フィールドは JSON オブジェクトのレベル 4 にあるため、結果の DataFrame には含まれません。

# 只深入到嵌套第二级
pd.json_normalize(results, record_path="issues", max_level = 2)
以下は、.json_normalize の

pandas 公式ドキュメントの説明です。理解できない場合は、自分で学習してください。今回は、Dong 兄弟が説明します。ここでそれを紹介します。 pandas 公式ドキュメント: https://pandas.pydata.org/pan...

以上がPython では、数秒で Dataframe に変換するネストされた JSON が導入されました。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。