2016-01-29 178 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