Python: Divide cada fila de un DataFrame por otro vector DataFrame

Tengo un DataFrame (df1) con una dimensión 2000 rows x 500 columns (excluyendo el índice) para el cual quiero dividir cada fila por otro DataFrame (df2) con dimensión 1 rows X 500 columns . Ambos tienen los mismos encabezados de columna. Lo intenté:

df.divide(df2) y df.divide(df2, axis='index') y muchas otras soluciones y siempre obtengo un df con valores nan en cada celda. ¿Qué argumento me falta en la función df.divide ?

En df.divide(df2, axis='index') , debe proporcionar el eje / fila de df2 (por ejemplo, df2.iloc[0] ).

 import pandas as pd data1 = {"a":[1.,3.,5.,2.], "b":[4.,8.,3.,7.], "c":[5.,45.,67.,34]} data2 = {"a":[4.], "b":[2.], "c":[11.]} df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) df1.div(df2.iloc[0], axis='columns') 

o puede usar df1/df2.values[0,:]

Puede dividir por la serie, es decir, la primera fila de df2:

 In [11]: df = pd.DataFrame([[1., 2.], [3., 4.]], columns=['A', 'B']) In [12]: df2 = pd.DataFrame([[5., 10.]], columns=['A', 'B']) In [13]: df.div(df2) Out[13]: AB 0 0.2 0.2 1 NaN NaN In [14]: df.div(df2.iloc[0]) Out[14]: AB 0 0.2 0.2 1 0.6 0.4 

Una pequeña aclaración por si acaso: la razón por la que obtuviste NaN en todas partes mientras el primer ejemplo de Andy ( df.div(df2) ) funciona para la primera línea es que div intenta hacer coincidir los índices (y columnas). En el ejemplo de Andy, el índice 0 se encuentra en ambos marcos de datos, por lo que se realiza la división, no el índice 1, por lo que se agrega una línea de NaN. Este comportamiento debería aparecer aún más obvio si ejecuta lo siguiente (solo se divide la línea ‘t’):

 df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't']) df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t']) df_a.div(df_b) 

Entonces, en su caso, el índice de la única fila de df2 aparentemente no estaba presente en df1. “Afortunadamente”, los encabezados de columna son los mismos en ambos marcos de datos, por lo que cuando se corta la primera fila, se obtiene una serie, cuyo índice está compuesto por los encabezados de columna de df2. Esto es lo que eventualmente permite que la división tenga lugar correctamente.

Para un caso con índice y coincidencia de columna:

 df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't'], columns = range(5)) df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t'], columns = [1,2,3,4,5]) df_a.div(df_b) 

Si desea dividir cada fila de una columna con un valor específico, puede probar:

 df['column_name'] = df['column_name'].div(10000) 

Para mí, este código dividió cada fila de ‘column_name’ con 10,000.

Para dividir una fila (con una o varias columnas), debemos hacer lo siguiente:

 df.loc['index_value'] = df.loc['index_value'].div(10000)