Pandas: вычесть строку из каждого элемента в строке

У меня есть dataframe со строками, индексированными по типу химического элемента и столбцам, представляющим разные образцы. Значения представляют собой float, представляющие степень присутствия элемента строки в каждом образце.

Я хочу вычислить среднее значение для каждой строки и вычесть его из каждого значения в этой конкретной строке для нормализации данных и создать новый блок данных этого набора данных.

Я попытался использовать средний (1), который дает мне объект серии со средним значением для каждого химического элемента, что хорошо, но затем я попытался использовать вычитание, которое не сработало.

2 Solutions collect form web for “Pandas: вычесть строку из каждого элемента в строке”

Вы можете использовать метод subdate DataFrame и указать, что вычитание должно происходить по строкам ( axis=0 ) в отличие от по умолчанию по столбцу:

 df.sub(df.mean(axis=1), axis=0) 

Вот пример:

 >>> df = pd.DataFrame({'a': [1.5, 2.5], 'b': [0.25, 2.75], 'c': [1.25, 0.75]}) >>> df abc 0 1.5 0.25 1.25 1 2.5 2.75 0.75 

Среднее значение для каждой строки вычисляется следующим образом:

 >>> df.mean(axis=1) 0 1 1 2 dtype: float64 

Чтобы разделить строки DataFrame, просто вычтите средние значения строк из df следующим образом:

 >>> df.sub(df.mean(axis=1), axis=0) abc 0 0.5 -0.75 0.25 1 0.5 0.75 -1.25 

Кроме превосходного ответа @ ajcr, вы можете подумать о том, как изменить ваши данные.

То, как вы делаете это сейчас, с разными образцами в разных столбцах, – это способ, которым он будет представлен, если вы используете электронную таблицу, но это может быть не самый полезный способ представления ваших данных.

Обычно каждый столбец представляет собой уникальную информацию об одном объекте реального мира . Типичным примером такого рода данных является человек:

 id name hair_colour Age 1 Bob Brown 25 

Действительно, ваши разные образцы – это разные объекты реального мира .

Поэтому я предлагаю иметь двухуровневый индекс для описания каждого отдельного фрагмента информации. Это позволяет манипулировать вашими данными так, как вы хотите, гораздо удобнее.

Таким образом:

 >>> df = pd.DataFrame([['Sn',1,2,3],['Pb',2,4,6]], columns=['element', 'A', 'B', 'C']).set_index('element') >>> df.columns.name = 'sample' >>> df # This is how your DataFrame looks at the moment sample ABC element Sn 1 2 3 Pb 2 4 6 >>> # Now make those columns into a second level of index >>> df = df.stack() >>> df element sample Sn A 1 B 2 C 3 Pb A 2 B 4 C 6 

Теперь у нас есть все вкусные функциональные возможности groupby :

 >>> demean = lambda x: x - x.mean() >>> df.groupby(level='element').transform(demean) element sample Sn A -1 B 0 C 1 Pb A -2 B 0 C 2 

Когда вы просматриваете свои данные таким образом, вы обнаружите, что многие и многие варианты использования, которые раньше были многоколоночными DataFrames , на самом деле являются MultiIndexed Series , и у вас гораздо больше возможностей для представления и преобразования данных.

  • Как правильно поворачивать или изменять форму таймсеров в Pandas?
  • создать новый столбец в области данных с помощью fuzzywuzzy
  • AttributeError: объект 'function' не имеет атрибута 'bar' в пандах
  • Лучший способ присоединиться / объединиться в пандах
  • Спектроскопические данные по спектру данных панд в 3D с разной длиной массива
  • Преобразование объекта Pandas tseries в DataFrame
  • Как изменить порядок / группировку / уровень столбцов Pandas MultiIndex?
  • Замена ненулевых значений именами столбцов
  • Python - лучший язык программирования в мире.