创建一个遍历数据帧行的函数,应用 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)] 等等。
我将如何创建一个辅助函数:
- 遍历数据框的行,"df";
- 创建一维 Numpy 数组对象,"z-score-array";
- 将数组输入函数:combine_pvalues(z-score-array, method='stouffer', weights=None),用于计算组合z_score;
- 将组合的 z 分数附加到数据框中的 "z_score_combined" 新列,"df";
- 输出一个更改后的版本数据框"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
如果这个问题看起来重复,请原谅我,但我找不到符合我确切要求的答案:
我有一个名为 "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)] 等等。
我将如何创建一个辅助函数:
- 遍历数据框的行,"df";
- 创建一维 Numpy 数组对象,"z-score-array";
- 将数组输入函数:combine_pvalues(z-score-array, method='stouffer', weights=None),用于计算组合z_score;
- 将组合的 z 分数附加到数据框中的 "z_score_combined" 新列,"df";
- 输出一个更改后的版本数据框"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