熊猫 >= 0.20:df.groupby(level=0, axis=1)
这里不需要 lambda,也不需要明确地查询df.columns
;groupby
接受level
可以与参数一起指定的axis
参数。这更干净,IMO。
# 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
列
另一种需要考虑的情况是在处理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
上述两种解决方案的备选方案分别是、 df.groupby(level=0, axis=1).first()
和... .last()
。