パンダ>=0.20:df.groupby(level=0, axis=1)
ここではラムダは必要ありません。また、明示的にクエリを実行する必要もありませんdf.columns
。引数と組み合わせて指定できる引数をgroupby
受け入れます。これはもっときれいです、IMO。level
axis
# Setup
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('AABBB'))
df
A A B B B
0 44 47 0 3 3
1 39 9 19 21 36
2 23 6 24 24 12
3 1 38 39 23 46
4 24 17 37 25 13
<!_>
df.groupby(level=0, axis=1).sum()
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
MultiIndex
列の処理
考慮すべきもう1つのケースは、MultiIndex
列を処理する場合です。検討
df.columns = pd.MultiIndex.from_arrays([['one']*3 + ['two']*2, df.columns])
df
one two
A A B B B
0 44 47 0 3 3
1 39 9 19 21 36
2 23 6 24 24 12
3 1 38 39 23 46
4 24 17 37 25 13
上位レベル全体で集計を実行するには、
df.groupby(level=1, axis=1).sum()
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
または、上位レベルごとにのみ集計する場合は、
df.groupby(level=[0, 1], axis=1).sum()
one two
A B B
0 91 0 6
1 48 19 57
2 29 24 36
3 39 39 69
4 41 37 38
代替解釈:重複する列の削除
(集計を実行せずに)重複する列を単純に削除する方法を探してここに来た場合は、次を使用してIndex.duplicated
ください。
df.loc[:,~df.columns.duplicated()]
A B
0 44 0
1 39 19
2 23 24
3 1 39
4 24 37
または、最後のものを保持するには、keep='last'
(デフォルトは'first'
)を指定します。
df.loc[:,~df.columns.duplicated(keep='last')]
A B
0 47 3
1 9 36
2 6 12
3 38 46
4 17 13
上記groupby
の2つのソリューションの代替案は、それぞれ、、 df.groupby(level=0, axis=1).first()
および... .last()
です。