web-dev-qa-db-ja.com

pandas DataFrameのレベルは何ですか?

私はドキュメントを読んでいますが、多くの説明と例では、当然のこととしてlevelsを使用しています。文書がデータ構造と定義の基本的な説明について少し不足しています。

データフレームのレベルとは何ですか? MultiIndexインデックスのレベルとは何ですか?

16
Raf

自分の質問 への回答を分析しているときにこの質問を見つけましたが、ジョンの回答が十分に満足できるものではありませんでした。いくつかの実験の後、私はレベルを理解し、共有することに決めたと思います:

短い答え:

レベルは、インデックスまたは列の一部です。

長い答え:

この複数列のgorupbyの例は、インデックスレベルを非常によく表しています。

問題のレポートデータにログオンした時間があるとします。

report = pd.DataFrame([
        [1, 10, 'John'],
        [1, 20, 'John'],
        [1, 30, 'Tom'],
        [1, 10, 'Bob'],
        [2, 25, 'John'],
        [2, 15, 'Bob']], columns = ['IssueKey','TimeSpent','User'])

   IssueKey  TimeSpent  User
0         1         10  John
1         1         20  John
2         1         30   Tom
3         1         10   Bob
4         2         25  John
5         2         15   Bob

ここのインデックスには1レベルしかありません(すべての行を識別するインデックス値は1つだけです)。インデックスは人工的(実行番号)であり、0〜5の形式の値で構成されます。

同じユーザーによって作成されたすべてのログを同じ問題にマージ(合計)したいとします(費やされた合計時間を得るために)ユーザーによる問題について)

time_logged_by_user = report.groupby(['IssueKey', 'User']).TimeSpent.sum()

IssueKey  User
1         Bob     10
          John    30
          Tom     30
2         Bob     15
          John    25

複数のユーザーが同じ問題に時間を記録したため、データインデックスには2つのレベルがあります。レベルはIssueKeyおよびUserです。レベルはインデックスの一部です(データフレーム/シリーズ内の行を識別することができるのは一緒にのみです)。

(タプルとして)インデックスの一部であるレベルは、Spyder変数エクスプローラーで適切に確認できます。

enter image description here

レベルがあると、選択したインデックス部分(level)に関してグループ内の値を集計する機会が得られます。例えば。ユーザーが問題に費やした最大時間を割り当てたい場合は、次のことができます。

max_time_logged_to_an_issue = time_logged_by_user.groupby(level='IssueKey').transform('max')

IssueKey  User
1         Bob     30
          John    30
          Tom     30
2         Bob     25
          John    25

これで最初の3行の値は30、問題に対応しているため1(上記のコードではUserレベルは無視されていました)。問題の同じ話2

これは便利です。すべての問題に最も多くの時間を費やしたユーザーを見つけたい場合:

issue_owners = time_logged_by_user[time_logged_by_user == max_time_logged_to_an_issue]

IssueKey  User
1         John    30
          Tom     30
2         John    25
19
Andrzej Gis

通常、DataFrameには1Dインデックスと列があります。

    x y
0   4 1
1   3 9

ここで、インデックスは[0、1]で、列は['x'、 'y']です。ただし、インデックスまたは列に複数のレベルを含めることができます。

    x y
    a b c
0 7 4 1 3
  8 3 9 5

ここで、列の最初のレベルは['x'、 'y'、 'y']で、2番目のレベルは['a'、 'b'、 'c']です。インデックスの最初のレベルは[0、0]で、2番目のレベルは[7、8]です。

7
John Zwinck