Python: разделите каждую строку DataFrame другим вектором DataFrame

У меня есть DataFrame (df1) с размером 2000 rows x 500 columns (исключая индекс), для которого я хочу разделить каждую строку на другой DataFrame (df2) с размером 1 rows X 500 columns. Оба имеют одинаковые заголовки столбцов. Я пробовал:

df.divide(df2) и df.divide(df2, axis='index') и несколько других решений, и я всегда получаю df с nan значениями в каждой ячейке. Какой аргумент мне не хватает в функции df.divide?

Ответы

Ответ 1

В df.divide(df2, axis='index') вам необходимо указать ось/строку df2 (например, 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')

или вы можете использовать df1/df2.values[0,:]

Ответ 2

Вы можете разделить на ряд, то есть первую строку 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]: 
     A    B
0  0.2  0.2
1  NaN  NaN

In [14]: df.div(df2.iloc[0])
Out[14]: 
     A    B
0  0.2  0.2
1  0.6  0.4

Ответ 3

Небольшое разъяснение на всякий случай: причина, по которой вы получили NaN повсюду, а первый пример Энди (df.div(df2)) работает для первой строки - div пытается сопоставить индексы (и столбцы). В примере Энди индекс 0 найден в обоих кадрах данных, поэтому выполняется разделение, а не индекс 1, поэтому добавляется строка NaN. Это поведение должно выглядеть еще более очевидным, если вы выполните следующее (разделяется только строка '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)

Итак, в вашем случае индекс единственной строки df2, по-видимому, отсутствовал в df1. "К счастью" заголовки столбцов одинаковы в обоих кадрах данных, поэтому, когда вы срезаете первую строку, вы получаете серию, индекс которой состоит из заголовков столбцов df2. Это то, что в конечном итоге позволяет деление проходить должным образом.

Для случая с совпадением индексов и столбцов:

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)

Ответ 4

Если вы хотите разделить каждую строку столбца на определенное значение, вы можете попробовать:

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

Для меня этот код разделил каждую строку 'column_name' на 10 000.

Ответ 5

чтобы разделить строку (с одним или несколькими столбцами), нам нужно сделать следующее:

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