python - with - Normalizar un DataFrame de pandas por fila
seleccionar columnas de un dataframe pandas (2)
¿Cuál es la forma más idiomática de normalizar cada fila de un DataFrame de pandas? La normalización de las columnas es fácil, por lo que una opción (¡muy fea!) Es:
(df.T / df.T.sum()).T
Las reglas de transmisión de pandas evitan que df / df.sum(axis=1)
haga esto
Para superar el problema de la transmisión, puede usar el método div
:
df.div(df.sum(axis=1), axis=0)
Ver http://pandas.pydata.org/pandas-docs/stable/basics.html#matching-broadcasting-behavior
Sugeriría utilizar bibliotecas de preprocesamiento de Scikit y transponer su marco de datos según sea necesario:
''''''
Created on 05/11/2015
@author: rafaelcastillo
''''''
import matplotlib.pyplot as plt
import pandas
import random
import numpy as np
from sklearn import preprocessing
def 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,yfinal
x,y = create_cos(70,24,3)
data = pandas.DataFrame(y)
x_values = data.columns.values
num_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()