【问题标题】:Creating a function which iterates through dataframe rows, applies a scipy function, appends the output to a new column and outputs modified dataframe创建一个遍历数据帧行的函数,应用 scipy 函数,将输出附加到新列并输出修改后的数据帧
【发布时间】:2020-06-06 12:25:48
【问题描述】:

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

我有一个名为“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 分数。

在这种情况下,z 分数将使用 scipy.stats 中的“combine_pvalues”函数进行组合。 更多信息请阅读: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-score 数组。例如,“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 分数附加到数据帧“df”中的“z_score_combined”新列;
  5. 输出更改后的版本数据帧“df”,其中包含组合 z 分数的新列。

提前谢谢你!

【问题讨论】:

  • 只接受一个答案,不能同时接受。

标签: python pandas numpy scipy helper


【解决方案1】:

使用 DataFrame.apply 和 lambda 函数,如果想要一列选择第一个 [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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2020-09-11
      • 2017-03-09
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多