パンダのデータフレームをすばやくネスト解除する方法

無重力

リストをネストしたデータフレームへのインポートを処理する必要があるJSONファイルは、データフレームに変換する前に、ネストされたdictのリストです。ファイル自体はネストされています。

サンプルJSON:

{
  "State": [
    {
      "ts": "2018-04-11T21:37:05.401Z",
      "sensor": [
        "accBodyX_ftPerSec2"
      ],
      "value": null
    },
    {
      "ts": "2018-04-11T21:37:05.901Z",
      "sensor": [
        "accBodyX_ftPerSec2"
      ],
      "value": [
        -3.38919
      ]
    },
    {
      "ts": "2018-04-11T21:37:05.901Z",
      "sensor": [
        "accBodyY_ftPerSec2"
      ],
      "value": [
        -2.004781
      ]
    },
    {
      "ts": "2018-04-11T21:37:05.901Z",
      "sensor": [
        "accBodyZ_ftPerSec2"
      ],
      "value": [
        -34.77694
      ]
    }
  ]
}

データフレームは次のようになります。

    sensor                  ts                          value
0   [accBodyX_ftPerSec2]    2018-04-11T21:37:05.901Z    [-3.38919]
1   [accBodyY_ftPerSec2]    2018-04-11T21:37:05.901Z    [-2.004781]
2   [accBodyZ_ftPerSec2]    2018-04-11T21:37:05.901Z    [-34.77694]

最終的には、ネストを削除するか、ネストを操作する方法を見つけてください。目標は、タイムスタンプを伴う特定のセンサー名の値のリストを、次のような処理/プロットのために別のデータフレームに抽出することです。

    ts                         value
0   2018-04-11T21:37:05.901Z   -3.38919
1   2018-04-11T21:37:06.401Z   -3.00241
2   2018-04-11T21:37:06.901Z   -3.87694

ネストを削除するためにこれを実行しましたが、100,000行だけでは低速ですが、ありがたいことにforループよりもはるかに高速です。(この投稿のおかげで、列に対するpython pandas操作が可能になりました

def func(row):
    row.sensor = row.sensor[0]
    if type(row.value) is list:
        row.value = row.value[0]
    return row

df.apply(func, axis=1)

ネストを操作するために、個々の値を抽出できます。例:これ:

print( df.iloc[:,2].iloc[1][0] )
-2.004781

ただし、各行内の各リストのインデックス0から値のリストを返そうとすると、最初の値だけが返されます。

print( df.iloc[:,2].iloc[:][0] )
-3.38919

もちろん、これはforループで実行できますが、まだ発見できないPandas関数で実行する方法があることはわかっています。

ブラッドソロモン

DataFrameに読み込む前に、手動でクリーンアップする必要がある場合があります。

>>> import json
>>> import pandas as pd


>>> def collapse_lists(data):
...     return [{k: v[0] if (isinstance(v, list) and len(v) == 1)
...             else v for k, v in d.items()} for d in data]


>>> with open('state.json') as f:
...     data = pd.DataFrame(collapse_lists(json.load(f)['State']))

>>> data
               sensor                        ts      value
0  accBodyX_ftPerSec2  2018-04-11T21:37:05.401Z        NaN
1  accBodyX_ftPerSec2  2018-04-11T21:37:05.901Z  -3.389190
2  accBodyY_ftPerSec2  2018-04-11T21:37:05.901Z  -2.004781
3  accBodyZ_ftPerSec2  2018-04-11T21:37:05.901Z -34.776940

これにより、JSONファイルがPythonの辞書リストに読み込まれ、長さ1のリストがスカラー値に変換されてから、その結果がDataFrameに読み込まれます。これは確かに最も効率的な手段ではありませんが、ファイルが大量でない限り、JSON自体を解析する他のオプションはおそらくやり過ぎです。

最後に、日時に変換するには:

>>> data['ts'] = pd.to_datetime(data['ts'])

>>> data.dtypes
sensor            object
ts        datetime64[ns]
value            float64
dtype: object

sensorおそらくかなりの量のメモリを節約するために、カテゴリデータ型への変換を検討することもできます。

カテゴリカルのメモリ使用量は、カテゴリの数とデータの長さに比例します。対照的に、オブジェクトのdtypeは、データの長さの定数倍です。(ソース)


明示的なループ形式では、これは次のようになります。

def collapse_lists(data):
    result = []
    for d in data:
        entry = {}
        for k, v in d.items():
            if isinstance(k, list) and len(v) == 1:
                entry.update({k: v[0]})
            else:
                entry.update({k: v})
        result.append(entry)
    return result

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダデータフレームのデータをすばやく正規化する方法は?

分類Dev

パンダデータフレームのデータをすばやく正規化する方法は?

分類Dev

パンダデータフレームのレコード列のネストを解除する

分類Dev

パンダのデータフレームをタプルのリストにすばやく変換する方法

分類Dev

パンダのデータフレーム行をordereddictにすばやく変換する方法

分類Dev

列パンダのネスト解除データフレーム

分類Dev

列パンダのネスト解除データフレーム

分類Dev

パンダのデータフレームの連結を解除する方法は?

分類Dev

テキストデータでパンダデータフレームのピボットを解除する

分類Dev

ブールインデックス付きのパンダデータフレーム(または他の高速ソリューション)からエッジリスト(itertoolsの組み合わせスタイル)をすばやく作成する方法は?

分類Dev

パンダのデータフレームグループ/チャンクの標準化(行をすばやく挿入する方法)

分類Dev

別のデータフレームからパンダデータフレームをすばやく作成する

分類Dev

パンダでデータフレームのピボットを解除する方法

分類Dev

パンダ:文字列タプルのリストをデータフレームにすばやく変換しますか?

分類Dev

パンダの複数の列に応じてデータフレームをすばやく選択する方法

分類Dev

パンダのデータフレームをネストされたjsonに変換する方法

分類Dev

ネストされたJSONをパンダデータフレームにフラット化する方法

分類Dev

パンダでデータフレームの文字列を整数IDにすばやく変更するにはどうすればよいですか?

分類Dev

パンダでネストされたリストをデータフレームに変換する方法

分類Dev

ネストされたforループからパンダデータフレームを構築する方法

分類Dev

ネストされたJSONキーをパンダデータフレームに正規化する方法

分類Dev

dropna()パンダデータフレームの後にインデックスパンダデータフレームをリセットする方法

分類Dev

パンダやPythonを使用して全体のデータフレーム内のカンマを削除する方法

分類Dev

パンダのデータフレームでネストされたJsonをフラット化する

分類Dev

ネストされたパンダのデータフレーム列をフラット化する

分類Dev

ネストされたdictのリストからネストされた列を持つパンダデータフレームを作成する方法

分類Dev

dictのリストからパンダのデータフレームにデータを抽出する方法は?

分類Dev

データフレームのピボットを解除してパンダに参加する

分類Dev

Pythonで2つのパンダデータフレーム列をカスタムソートする方法は?

Related 関連記事

  1. 1

    パンダデータフレームのデータをすばやく正規化する方法は?

  2. 2

    パンダデータフレームのデータをすばやく正規化する方法は?

  3. 3

    パンダデータフレームのレコード列のネストを解除する

  4. 4

    パンダのデータフレームをタプルのリストにすばやく変換する方法

  5. 5

    パンダのデータフレーム行をordereddictにすばやく変換する方法

  6. 6

    列パンダのネスト解除データフレーム

  7. 7

    列パンダのネスト解除データフレーム

  8. 8

    パンダのデータフレームの連結を解除する方法は?

  9. 9

    テキストデータでパンダデータフレームのピボットを解除する

  10. 10

    ブールインデックス付きのパンダデータフレーム(または他の高速ソリューション)からエッジリスト(itertoolsの組み合わせスタイル)をすばやく作成する方法は?

  11. 11

    パンダのデータフレームグループ/チャンクの標準化(行をすばやく挿入する方法)

  12. 12

    別のデータフレームからパンダデータフレームをすばやく作成する

  13. 13

    パンダでデータフレームのピボットを解除する方法

  14. 14

    パンダ:文字列タプルのリストをデータフレームにすばやく変換しますか?

  15. 15

    パンダの複数の列に応じてデータフレームをすばやく選択する方法

  16. 16

    パンダのデータフレームをネストされたjsonに変換する方法

  17. 17

    ネストされたJSONをパンダデータフレームにフラット化する方法

  18. 18

    パンダでデータフレームの文字列を整数IDにすばやく変更するにはどうすればよいですか?

  19. 19

    パンダでネストされたリストをデータフレームに変換する方法

  20. 20

    ネストされたforループからパンダデータフレームを構築する方法

  21. 21

    ネストされたJSONキーをパンダデータフレームに正規化する方法

  22. 22

    dropna()パンダデータフレームの後にインデックスパンダデータフレームをリセットする方法

  23. 23

    パンダやPythonを使用して全体のデータフレーム内のカンマを削除する方法

  24. 24

    パンダのデータフレームでネストされたJsonをフラット化する

  25. 25

    ネストされたパンダのデータフレーム列をフラット化する

  26. 26

    ネストされたdictのリストからネストされた列を持つパンダデータフレームを作成する方法

  27. 27

    dictのリストからパンダのデータフレームにデータを抽出する方法は?

  28. 28

    データフレームのピボットを解除してパンダに参加する

  29. 29

    Pythonで2つのパンダデータフレーム列をカスタムソートする方法は?

ホットタグ

アーカイブ