Создание функции, которая выполняет итерацию по строкам фрейма данных, применяет функцию scipy, добавляет вывод в новый столбец и выводит измененный фрейм данных - PullRequest
0 голосов
/ 22 февраля 2020

Простите, если этот вопрос кажется дублирующим, но я не смог найти ответ, который точно соответствует моим требованиям:

У меня есть фрейм данных с z-показателями, названный "df", который структурирован следующим образом:

    score_1 score_2 score_3 score_4
1   0.15    0.20    0.81    0.60
2   0.70    0.55    0.84    0.50
3   0.90    0.33    0.54    0.07

Я хотел бы создать новый столбец "z_score_combined", в котором объединены z-оценки каждой строки.

В этом случае z- результаты будут объединены с использованием функции "comb_pvalues" из scipy.stats. Для получения дополнительной информации читайте: https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.combine_pvalues.html

Функция структурирована следующим образом:

combine_pvalues(z-score-array, method='stouffer', weights=None)

В функции "z-счет" -array "- это массив z-показателей из каждой строки. Например, «array_1» будет массивом z-показателей из строки, индексированной 1 в «df»; т.е. массив_1 = [(0,15, 0,20, 0,81, 0,60)], массив_2 = [(0,70, 0,55, 0,84, 0,50)] и т. д.

Как создать вспомогательную функцию, которая:

  1. Итерация по строкам кадра данных, "df";
  2. Создание объекта массива 1D Numpy , "z-score-array";
  3. Подает массив в функцию: comb_pvalues ​​(z-Score-array, method = 'stouffer', weights = None), для вычисления объединенного z_score;
  4. Добавляет объединенную z-оценку в новый столбец "z_score_combined" в кадре данных, "df";
  5. Выводит измененный вариант данных в кадре "df" с новым столбцом объединенных z-оценок.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Используйте DataFrame.apply с лямбда-функцией, если хотите, чтобы один столбец выбрал первый [0] или второе значение [1] из кортежей:

from scipy.stats import combine_pvalues
df['pval'] = df.apply(lambda x: combine_pvalues(x, method='stouffer', weights=None)[1], axis=1)
print (df)
   score_1  score_2  score_3  score_4      pval
1     0.15     0.20     0.81     0.60  0.354423
2     0.70     0.55     0.84     0.50  0.794535
3     0.90     0.33     0.54     0.07  0.394789

Если хотите вывести 2 значения в 2 столбца добавить параметр result_type='expand':

from scipy.stats import combine_pvalues

f = lambda x: combine_pvalues(x, method='stouffer', weights=None)
df[['stat','pval']] = df.apply(f, axis=1, result_type='expand')
print (df)
   score_1  score_2  score_3  score_4      stat      pval
1     0.15     0.20     0.81     0.60  0.373406  0.354423
2     0.70     0.55     0.84     0.50 -0.822260  0.794535
3     0.90     0.33     0.54     0.07  0.266859  0.394789
1 голос
/ 22 февраля 2020

попробуй df.apply. Вы можете создать функцию, которая принимает строку, и каждая строка может получить доступ к атрибутам из столбцов 1-4. Это исключает необходимость создания массива для zscores, поскольку вы выполняете итерации по этим строкам. Эта функция должна возвращать значение, которое должно быть go в столбце комбинированном_z_score для этой строки. Затем создайте новый столбец как:

df ['new_column'] = df.apply (your_function, axis = 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...