2016-01-29 143 views
1

我有一个有4列的数据框。我想价值做第3列的逐元素师在第4列广播错误大熊猫

我想:

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)更好的方式,它似乎很奇怪,它没有第二个维度。

最好的问候,

+0

如果我的答案回答了您的问题,请接受答案,以便问题不会得到解答,我的答案左上角会出现一个空的刻度标记 – EdChum

+0

对不起 - 伙计 - 只是更新了它。 – BMichell

回答

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是如何工作的,这并不明显。

+0

现在我觉得很愚蠢...... ;-) – BMichell