Pandas DataFrame 自定义聚合函数奇怪的行为
Pandas DataFrame custom agg function strange behavior
我想使用自定义函数沿轴聚合 Pandas DataFrame,但我无法弄清楚该函数应该 return.
df = pd.DataFrame(np.arange(50).reshape(10,5))
您可以将 numpy 函数传递给 DataFrame.agg
:
# Case 1
df.agg([np.mean], axis=1)
你得到了你所期望的:一个像 df 一样索引的 DataFrame,但只有一列:'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)
为什么后两种情况的工作方式与第一种情况不同?
如果我没记错的话,Case 2
中发生的是 np.mean() 操作首先展平数组,因此正在计算每行条目的每列的平均值,这就是为什么当你 运行 df.agg([lambda x:np.mean(x)], axis=1)
其中 returns:
时你得到 DataFrame 中每个条目的平均值的原因
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
关于 numpy 聚合函数与 the pandas documentation on the aggregation function 中的 pandas 聚合操作有何不同的具体点。
要使 Case 2
的行为与 Case 1
相同,您可以在 np.mean() 函数本身中指定轴:df.agg([lambda x:np.mean(x,axis=0)],axis=1)
,其中 returns以下:
<lambda>
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
同样,您可以通过在 np.mean() 函数中指定 axis=0
使 Case 3
的行为与 Case 1
的行为相同:
def f(x, **kwargs):
return np.mean(x, axis=0, **kwargs)
df.agg([f], axis=1)
还有这个returns:
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
我想使用自定义函数沿轴聚合 Pandas DataFrame,但我无法弄清楚该函数应该 return.
df = pd.DataFrame(np.arange(50).reshape(10,5))
您可以将 numpy 函数传递给 DataFrame.agg
:
# Case 1
df.agg([np.mean], axis=1)
你得到了你所期望的:一个像 df 一样索引的 DataFrame,但只有一列:'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)
为什么后两种情况的工作方式与第一种情况不同?
如果我没记错的话,Case 2
中发生的是 np.mean() 操作首先展平数组,因此正在计算每行条目的每列的平均值,这就是为什么当你 运行 df.agg([lambda x:np.mean(x)], axis=1)
其中 returns:
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
关于 numpy 聚合函数与 the pandas documentation on the aggregation function 中的 pandas 聚合操作有何不同的具体点。
要使 Case 2
的行为与 Case 1
相同,您可以在 np.mean() 函数本身中指定轴:df.agg([lambda x:np.mean(x,axis=0)],axis=1)
,其中 returns以下:
<lambda>
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
同样,您可以通过在 np.mean() 函数中指定 axis=0
使 Case 3
的行为与 Case 1
的行为相同:
def f(x, **kwargs):
return np.mean(x, axis=0, **kwargs)
df.agg([f], axis=1)
还有这个returns:
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