Normalizing a pandas DataFrame by row Normalizing a pandas DataFrame by row python python

Normalizing a pandas DataFrame by row


To overcome the broadcasting issue, you can use the div method:

df.div(df.sum(axis=1), axis=0)

See pandas User Guide: Matching / broadcasting behavior


I would suggest to use Scikit preprocessing libraries and transpose your dataframe as required:

'''Created on 05/11/2015@author: rafaelcastillo'''import matplotlib.pyplot as pltimport pandasimport randomimport numpy as npfrom sklearn import preprocessingdef create_cos(number_graphs,length,amp):    # This function is used to generate cos-kind graphs for testing    # number_graphs: to plot    # length: number of points included in the x axis    # amp: Y domain modifications to draw different shapes    x = np.arange(length)    amp = np.pi*amp    xx = np.linspace(np.pi*0.3*amp, -np.pi*0.3*amp, length)    for i in range(number_graphs):        iterable = (2*np.cos(x) + random.random()*0.1 for x in xx)        y = np.fromiter(iterable, np.float)        if i == 0:             yfinal =  y            continue        yfinal = np.vstack((yfinal,y))    return x,yfinalx,y = create_cos(70,24,3)data = pandas.DataFrame(y)x_values = data.columns.valuesnum_rows = data.shape[0]fig, ax = plt.subplots()for i in range(num_rows):    ax.plot(x_values, data.iloc[i])ax.set_title('Raw data')plt.show() std_scale = preprocessing.MinMaxScaler().fit(data.transpose())df_std = std_scale.transform(data.transpose())data = pandas.DataFrame(np.transpose(df_std))fig, ax = plt.subplots()for i in range(num_rows):    ax.plot(x_values, data.iloc[i])ax.set_title('Data Normalized')plt.show()