私はドキュメントを読んでいますが、多くの説明と例では、当然のこととしてlevels
を使用しています。文書がデータ構造と定義の基本的な説明について少し不足しています。
データフレームのレベルとは何ですか? MultiIndex
インデックスのレベルとは何ですか?
自分の質問 への回答を分析しているときにこの質問を見つけましたが、ジョンの回答が十分に満足できるものではありませんでした。いくつかの実験の後、私はレベルを理解し、共有することに決めたと思います:
短い答え:
レベルは、インデックスまたは列の一部です。
長い答え:
この複数列の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変数エクスプローラーで適切に確認できます。
レベルがあると、選択したインデックス部分(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
通常、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]です。