广播错误熊猫

时间:2016-01-29 10:51:17

标签: python pandas

我有一个包含4列的数据框。我想通过第4列中的值

对前3列进行元素划分

我试过了:

df2 = pd.DataFrame(df.ix[:,['col1', 'col2', 'col3']].values / df.col4.values)

我收到了这个错误:

ValueError: operands could not be broadcast together with shapes (19,3) (19,) 

我的解决方案是:

df2 = pd.DataFrame(df.ix[:,['col1', 'col2', 'col3']].values / df.col4.values.reshape(19,1))

这可以按照我想要的方式工作,但要对不同数量的行保持健壮,我需要这样做:

.reshape(len(df),1)

这似乎是一种丑陋的方式来做某事 - 是否有更好的方法围绕阵列形状(19,)它似乎很奇怪它没有第二维。

最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

您可以执行div并传递axis=0以强制执行分组:

df2 = pd.DataFrame(df.ix[:,['col1', 'col2', 'col3']].div(df.col4, axis=0))

您的错误是因为在短轴上执行使用/的除法,在这种情况下是行轴并且没有直接对齐,请参阅此示例:

In [220]:
df = pd.DataFrame(columns=list('abcd'), data = np.random.randn(8,4))
df

Out[220]:
          a         b         c         d
0  1.074803  0.173520  0.211027  1.357138
1  1.418757 -1.879024  0.536826  1.006160
2 -0.029716 -1.146178  0.100900 -1.035018
3  0.314665 -0.773723 -1.170653  0.648740
4 -0.179666  1.291836 -0.009614  0.392149
5  0.264599 -0.057409 -1.425638  1.024098
6 -0.106062  1.824375  0.595974  1.167115
7  0.601544 -1.237881  0.106854 -1.276829

In [221]:
df.ix[:,['a', 'b', 'c']]/df['d']

Out[221]:
    a   b   c   0   1   2   3   4   5   6   7
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

在了解broadcasting的工作原理之前,这一点并不明显。