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 dplyr :: summary?
  • Добавление баров ошибок к групповому графику в пандах
  • Как выбрать только определенные столбцы из DataFrame с столбцами MultiIndex?
  • df.loc вызывает предупреждающее сообщение SettingWithCopyWarning
  • Преобразование результатов запроса в DataFrame в python
  • Агрегация Pandas игнорирует NaN
  • Сделать столбец из индекса dataframe pandas
  • Pandas - Объяснение о применении функции медленное
  • Как преобразовать pandas / dataframe в XML?
  • Слияние двух фреймов данных по нескольким значениям
  • назначение pandas multiindex из другого фрейма данных
  • Python - лучший язык программирования в мире.