私はこのデータを持っています:
import pandas as pd
import numpy as np
index = pd.MultiIndex.from_tuples(list(zip(*[['one', 'one', 'two', 'two'],['foo', 'bar', 'foo', 'bar']])))
df = pd.DataFrame(np.arange(12).reshape((3,4)), columns=index)
one two
foo bar foo bar
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
次のような特定の列レベルのペアを参照せずに、レベル1の各列のレベル0のグループ列ごとに単純なベクトル化された計算(加算など)を実行する方法はありますか?
df[('one','add')] = df[('one','foo')]+df[('one','bar')]
入手したい
one two
foo bar add foo bar add
0 0 1 1 2 3 5
1 4 5 9 6 7 13
2 8 9 17 10 11 21
私は少しそれをいじりました、そしてここに私の意見の問題を解決するワンライナーがあります。完全にベクトル化されており、特定の列名には対応していません。また、add
列を適切な場所に配置します。
df.stack(0).assign(add=df.stack(0).sum(axis=1)).stack(0).unstack(0).T
残念ながら、最も内側のレベルでスタック/アンスタックを実行するためのスタック/アンスタックのプロパティのため、不可解な.stack(0).unstack(0)
操作が必要です。これらの2つの操作は互いに打ち消し合う必要があるように見えますが、実際には、順序を維持しながらインデックスレベルをシャッフルします。
これは、assignステートメントなしで3行に分割された同じものです。
df = df.stack(0)
df['add'] = df.sum(axis=1)
df = df.stack(0).unstack(0).T
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加