创建一个遍历数据帧行的函数,应用 scipy 函数,将输出附加到新列并输出修改后的数据帧

Creating a function which iterates through dataframe rows, applies a scipy function, appends the output to a new column and outputs modified dataframe

如果这个问题看起来重复,请原谅我,但我找不到符合我确切要求的答案:

我有一个名为 "df" 的 z 分数数据框,其结构如下:

    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 分数。

在这种情况下,将使用 scipy.stats 中的 "combine_pvalues" 函数组合 z 分数。 阅读更多信息: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-score-array" 是每一行的 z 分数数组。例如 "array_1" 将是 "df" 中索引为 1 的行的 z 分数数组;即 array_1 = [(0.15, 0.20, 0.81, 0.60)], array_2 = [(0.70, 0.55, 0.84, 0.50)] 等等。

我将如何创建一个辅助函数:

  1. 遍历数据框的行,"df";
  2. 创建一维 Numpy 数组对象,"z-score-array";
  3. 将数组输入函数:combine_pvalues(z-score-array, method='stouffer', weights=None),用于计算组合z_score;
  4. 将组合的 z 分数附加到数据框中的 "z_score_combined" 新列,"df";
  5. 输出一个更改后的版本数据框"df",其中包含新的组合 z 分数列。

提前致谢!

尝试df.apply。您可以创建一个接受一行的函数,每一行都可以访问第 1-4 列的属性。这省略了为 zscores 创建数组的需要,因为您正在迭代这些行。该函数应该 return 该行的 combined_z_score 列中的值。然后创建新列为:

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

DataFrame.apply 与 lambda 函数一起使用,如果想要第一列 select [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