pandas文档中的“广播”是什么意思?
我正在阅读“pandas”文档,“广播”一词被广泛使用 ,但从未真正定义或解释过。
这是什么意思?
所以术语广播来自numpy ,简单地说就是当你在n维数组(可能是面板,数据框,系列)或标量值之间执行操作时,会导致输出的规则。
使用标量值进行广播
所以最简单的情况就是乘以一个标量值:
In [4]: s = pd.Series(np.arange(5)) s Out[4]: 0 0 1 1 2 2 3 3 4 4 dtype: int32 In [5]: s * 10 Out[5]: 0 0 1 10 2 20 3 30 4 40 dtype: int32
我们用一个数据框得到相同的预期结果:
In [6]: df = pd.DataFrame({'a':np.random.randn(4), 'b':np.random.randn(4)}) df Out[6]: ab 0 0.216920 0.652193 1 0.968969 0.033369 2 0.637784 0.856836 3 -2.303556 0.426238 In [7]: df * 10 Out[7]: ab 0 2.169204 6.521925 1 9.689690 0.333695 2 6.377839 8.568362 3 -23.035557 4.262381
那么技术上在这里发生的是,标量值已经沿着上面的Series和DataFrame的相同维度被广播了。
使用一维数组进行广播
假设我们有一个形状为4 x 3(4行x 3列)的二维数据框,我们可以使用与行长度相同长度的1-D系列来执行沿x轴的操作:
In [8]: df = pd.DataFrame({'a':np.random.randn(4), 'b':np.random.randn(4), 'c':np.random.randn(4)}) df Out[8]: abc 0 0.122073 -1.178127 -1.531254 1 0.011346 -0.747583 -1.967079 2 -0.019716 -0.235676 1.419547 3 0.215847 1.112350 0.659432 In [26]: df.iloc[0] Out[26]: a 0.122073 b -1.178127 c -1.531254 Name: 0, dtype: float64 In [27]: df + df.iloc[0] Out[27]: abc 0 0.244146 -2.356254 -3.062507 1 0.133419 -1.925710 -3.498333 2 0.102357 -1.413803 -0.111707 3 0.337920 -0.065777 -0.871822
上面看起来好笑,直到你明白发生了什么,我把第一行的值,并添加到df这一行,它可以用这张图片(源自scipy
)可视化:
一般的规则是这样的:
为了广播,操作中两个数组的尾部轴的大小必须是相同的大小,或者其中一个必须是一个。
所以,如果我试图添加一个长度不匹配的1-D数组,比如一个有4个元素的数组,不像numpy会引发一个ValueError
,在Pandas中,你会得到一个完整的NaN
值:
In [30]: df + pd.Series(np.arange(4)) Out[30]: abc 0 1 2 3 0 NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN NaN NaN
现在关于大pandas的一些很棒的事情是,它会尝试使用现有的列名和行标签进行alignment,这可能会阻碍像这样进行一个更好的播放:
In [55]: df[['a']] + df.iloc[0] Out[55]: abc 0 0.244146 NaN NaN 1 0.133419 NaN NaN 2 0.102357 NaN NaN 3 0.337920 NaN NaN
在上面我使用双下标强制形状是(4,1),但我们看到一个问题,当试图广播使用第一行列alignment只在第一列alignment。 为了得到与上面的图一样的广播forms,我们必须将其分解为numpy数组,然后这些数组成为匿名数据:
In [56]: df[['a']].values + df.iloc[0].values Out[56]: array([[ 0.24414608, -1.05605392, -1.4091805 ], [ 0.13341899, -1.166781 , -1.51990758], [ 0.10235701, -1.19784299, -1.55096957], [ 0.33792013, -0.96227987, -1.31540645]])
也有可能以三维广播,但我不经常靠近那些东西,但是那些大块的,scipy和pandas的书有例子说明它是如何工作的。
一般来说要记住的是,除了简单的标量值之外,对于nD数组,次/尾轴长度必须匹配或者其中的一个必须是1。