如果我的数据框包含具有相同名称的列,是否有办法将具有相同名称的列与某种功能(即总和)组合在一起?
例如:
In [186]:
df["NY-WEB01"].head()
Out[186]:
NY-WEB01 NY-WEB01
DateTime
2012-10-18 16:00:00 5.6 2.8
2012-10-18 17:00:00 18.6 12.0
2012-10-18 18:00:00 18.4 12.0
2012-10-18 19:00:00 18.2 12.0
2012-10-18 20:00:00 19.2 12.0
如何通过汇总列名相同的每一行来折叠NY-WEB01列(有一堆重复的列,而不仅仅是NY-WEB01)?
答案 0 :(得分:19)
我相信这就是你所追求的:
df.groupby(lambda x:x, axis=1).sum()
或者,根据df的长度,快3%到15%之间:
df.groupby(df.columns, axis=1).sum()
编辑:要将此数字扩展到总和以上,请使用.agg()
(.aggregate()
的缩写):
df.groupby(df.columns, axis=1).agg(numpy.max)
答案 1 :(得分:4)
GroupBy
,带有level
和axis
参数这里不需要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()
。
答案 2 :(得分:1)
这是常见的聚合函数(如sum
,mean
,median
,max
,min
,std
的更简单的解决方案-仅使用参数axis=1
处理列和level
:
#coldspeed samples
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('AABBB'))
print (df)
print (df.sum(axis=1, level=0))
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
df.columns = pd.MultiIndex.from_arrays([['one']*3 + ['two']*2, df.columns])
print (df.sum(axis=1, level=1))
A B
0 91 6
1 48 76
2 29 60
3 39 108
4 41 75
print (df.sum(axis=1, level=[0,1]))
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
类似它适用于索引,然后使用axis=0
代替axis=1
:
np.random.seed(0)
df = pd.DataFrame(np.random.choice(50, (5, 5)), columns=list('ABCDE'), index=list('aabbc'))
print (df)
A B C D E
a 44 47 0 3 3
a 39 9 19 21 36
b 23 6 24 24 12
b 1 38 39 23 46
c 24 17 37 25 13
print (df.min(axis=0, level=0))
A B C D E
a 39 9 0 3 3
b 1 6 24 23 12
c 24 17 37 25 13
df.index = pd.MultiIndex.from_arrays([['bar']*3 + ['foo']*2, df.index])
print (df.mean(axis=0, level=1))
A B C D E
a 41.5 28.0 9.5 12.0 19.5
b 12.0 22.0 31.5 23.5 29.0
c 24.0 17.0 37.0 25.0 13.0
print (df.max(axis=0, level=[0,1]))
A B C D E
bar a 44 47 19 21 36
b 23 6 24 24 12
foo b 1 38 39 23 46
c 24 17 37 25 13
如果需要使用其他功能,例如first
,last
,size
,count
,则必须使用coldspeed answer