i have dataframe 4 columns. want element-wise division of first 3 columns value in 4th column
i tried:
df2 = pd.dataframe(df.ix[:,['col1', 'col2', 'col3']].values / df.col4.values)
and got error:
valueerror: operands not broadcast shapes (19,3) (19,)
my solution was:
df2 = pd.dataframe(df.ix[:,['col1', 'col2', 'col3']].values / df.col4.values.reshape(19,1))
this worked wanted, robust different numbers of rows need do:
.reshape(len(df),1)
it seems ugly way have - there better way around array shape being (19,) seems odd has no second dimension.
best regards,
ben
you can div
, pass axis=0
force division performed column-wise:
df2 = pd.dataframe(df.ix[:,['col1', 'col2', 'col3']].div(df.col4, axis=0))
your error because division using /
being performed on minor axis in case row axis , there no direct alignment, see example:
in [220]: df = pd.dataframe(columns=list('abcd'), data = np.random.randn(8,4)) df out[220]: 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]: 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
this isn't obvious until understand how broadcasting works.
Comments
Post a Comment