Pandas 熊猫数据帧自定义agg函数奇怪的行为
我想使用一个自定义函数沿一个轴聚合一个数据帧,但我很难确定该函数应该返回什么Pandas 熊猫数据帧自定义agg函数奇怪的行为,pandas,aggregation,Pandas,Aggregation,我想使用一个自定义函数沿一个轴聚合一个数据帧,但我很难确定该函数应该返回什么 df = pd.DataFrame(np.arange(50).reshape(10,5)) 您可以将numpy函数传递给DataFrame.agg: # Case 1 df.agg([np.mean], axis=1) 您将得到您所期望的:一个数据帧,它的索引与df一样,但只有一列:“mean”。 但出于某种原因,以下行为完全不同: # Case 2 df.agg([lambda x:np.mean(x)], a
df = pd.DataFrame(np.arange(50).reshape(10,5))
您可以将numpy函数传递给DataFrame.agg
:
# Case 1
df.agg([np.mean], axis=1)
您将得到您所期望的:一个数据帧,它的索引与df一样,但只有一列:“mean”。
但出于某种原因,以下行为完全不同:
# Case 2
df.agg([lambda x:np.mean(x)], axis=1)
甚至
# Case 3
def f(x, **kwargs):
return np.mean(x, **kwargs)
df.agg([f], axis=1)
为什么后两种情况的工作方式与第一种情况有所不同?如果我没有弄错的话,
情况2中发生的事情是np.mean()操作首先将数组展平,因此将计算每个行条目的每列平均值,这就是为什么在运行df.agg([lambda x:np.mean(x)],axis=1)时,您会得到数据帧中每个条目的平均值。
返回:
0 1 2 3 4
0 <lambda> 0.0 1.0 2.0 3.0 4.0
1 <lambda> 5.0 6.0 7.0 8.0 9.0
2 <lambda> 10.0 11.0 12.0 13.0 14.0
3 <lambda> 15.0 16.0 17.0 18.0 19.0
4 <lambda> 20.0 21.0 22.0 23.0 24.0
5 <lambda> 25.0 26.0 27.0 28.0 29.0
6 <lambda> 30.0 31.0 32.0 33.0 34.0
7 <lambda> 35.0 36.0 37.0 38.0 39.0
8 <lambda> 40.0 41.0 42.0 43.0 44.0
9 <lambda> 45.0 46.0 47.0 48.0 49.0
类似地,通过在np.mean()函数中指定axis=0
,可以使Case 3
的行为与Case 1
的行为相同:
def f(x, **kwargs):
return np.mean(x, axis=0, **kwargs)
df.agg([f], axis=1)
这将返回:
f
0 2.0
1 7.0
2 12.0
3 17.0
4 22.0
5 27.0
6 32.0
7 37.0
8 42.0
9 47.0
f
0 2.0
1 7.0
2 12.0
3 17.0
4 22.0
5 27.0
6 32.0
7 37.0
8 42.0
9 47.0