因此,术语 广播
来自numpy,简而言之,它解释了您在n维数组(可以是面板,数据框,序列)或标量值之间执行操作时所产生的输出规则。
使用标量值广播
因此,最简单的情况是乘以标量值:
In [4]:s = pd.Series(np.arange(5))sOut[4]:0 01 12 23 34 4dtype: int32In [5]: s * 10Out[5]:0 01 102 203 304 40dtype: int32
并使用数据框获得相同的预期结果:
In [6]: df = pd.Dataframe({'a':np.random.randn(4), 'b':np.random.randn(4)})dfOut[6]: a b0 0.216920 0.6521931 0.968969 0.0333692 0.637784 0.8568363 -2.303556 0.426238In [7]: df * 10Out[7]:a b0 2.169204 6.5219251 9.689690 0.3336952 6.377839 8.5683623 -23.035557 4.262381因此,从技术上讲,这里的标量值是沿着与上述Series和Dataframe相同的维度 广播 的。
使用一维数组进行广播
假设我们有一个形状为4 x 3(4行x 3列)的2D数据帧,我们可以使用与行长相同长度的1D系列沿x轴执行操作:
In [8]:df = pd.Dataframe({'a':np.random.randn(4), 'b':np.random.randn(4), 'c':np.random.randn(4)})dfOut[8]: a b c0 0.122073 -1.178127 -1.5312541 0.011346 -0.747583 -1.9670792 -0.019716 -0.235676 1.4195473 0.215847 1.112350 0.659432In [26]: df.iloc[0]Out[26]:a 0.122073b -1.178127c -1.531254Name: 0, dtype: float64In [27]: df + df.iloc[0]Out[27]: a b c0 0.244146 -2.356254 -3.0625071 0.133419 -1.925710 -3.4983332 0.102357 -1.413803 -0.1117073 0.337920 -0.065777 -0.871822上面的内容乍看之下很有趣,直到您了解发生了什么,我将值的第一行添加到df中,然后可以使用此图片(源自
scipy)将其可视化:
一般规则是这样的:
为了进行广播,操作中两个阵列的尾轴尺寸必须相同,或者其中之一必须相同。
因此,如果我尝试添加长度不匹配的一维数组,请说一个包含4个元素的数组,与numpy不同,它将
ValueError在Pandas中引发a
,您将获得一个充满
NaN值的df :
In [30]:df + pd.Series(np.arange(4))Out[30]: a b c 0 1 2 30 NaN NaN NaN NaN NaN NaN NaN1 NaN NaN NaN NaN NaN NaN NaN2 NaN NaN NaN NaN NaN NaN NaN3 NaN NaN NaN NaN NaN NaN NaN
现在,关于pandas的一些很棒的事情是,它将尝试使用现有的列名和行标签进行对齐,这可能会妨碍尝试进行如下更漂亮的广播:
In [55]:df[['a']] + df.iloc[0]Out[55]: a b c0 0.244146 NaN NaN1 0.133419 NaN NaN2 0.102357 NaN NaN3 0.337920 NaN NaN
在上面,我使用双下标强制将形状设置为(4,1),但是当尝试使用第一行进行广播时,由于列对齐仅在第一列上对齐,因此我们看到一个问题。为了获得与上图所示相同的广播形式,我们必须分解为numpy数组,然后这些数组成为匿名数据:
In [56]:df[['a']].values + df.iloc[0].valuesOut[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]])
也可以进行3维广播,但是我并不经常去看那些东西,但是那堆麻木,肮脏和熊猫书中有一些例子说明了它是如何工作的。
一般而言,要记住的事情是,除了简单的标量值外,对于nD数组,短轴/尾轴的长度必须匹配,或者其中之一必须为1。
更新资料
似乎上述情况导致
ValueError: Unable to coerce to Series, length must be 1: given3了最新版本的Pandas
0.20.2
所以你要调用
.values的
df第一:
In[42]:df[['a']].values + df.iloc[0].valuesOut[42]: array([[ 0.244146, -1.056054, -1.409181], [ 0.133419, -1.166781, -1.519908], [ 0.102357, -1.197843, -1.55097 ], [ 0.33792 , -0.96228 , -1.315407]])
要将其恢复为原始df,我们可以从np数组构造一个df并将args中的原始列传递给构造函数:
In[43]:pd.Dataframe(df[['a']].values + df.iloc[0].values, columns=df.columns)Out[43]:a b c0 0.244146 -1.056054 -1.4091811 0.133419 -1.166781 -1.5199082 0.102357 -1.197843 -1.5509703 0.337920 -0.962280 -1.315407



