Python Pandas:将函数应用于数据框

hli*_*117 12 python vectorization scipy pandas

有没有一种方法,我可以使用SciPy的功能就像在地方上一个(或)使用的变体,等等?norm.cdf numpy.arraypandas.DataFramenumpy.applynumpy.apply_along_axs


背景是,我有一个z得分值表,我想将其转换为规范分布的CDF值.我目前使用norm.cdfscipy这一点.

我目前正在操纵具有非数字值的数据帧.

      Name      Val1      Val2      Val3      Val4 
0        A -1.540369 -0.077779  0.979606 -0.667112   
1        B -0.787154  0.048412  0.775444 -0.510904   
2        C -0.477234  0.414388  1.250544 -0.411658   
3        D -1.430851  0.258759  1.247752 -0.883293   
4        E -0.360181  0.485465  1.123589 -0.379157
Run Code Online (Sandbox Code Playgroud)

(使Name变量成为索引是一种解决方案,但在我的实际数据集中,名称不是字母字符.)

要仅修改数字数据,我使用df._get_numeric_data()的私有函数返回包含数据框的数字数据的数据框.但是,没有任何set功能.因此,如果我打电话

norm.cdf(df._get_numeric_data)
Run Code Online (Sandbox Code Playgroud)

这不会改变df原始数据.

我试图通过应用norm.cdf到数字数据来避免这种情况,因此这会改变我的原始数据集.

And*_*den 6

我想,我宁愿select_dtypes_get_numeric_data:

In [11]: df.select_dtypes(include=[np.number])
Out[11]:
       Val1      Val2      Val3      Val4
0 -1.540369 -0.077779  0.979606 -0.667112
1 -0.787154  0.048412  0.775444 -0.510904
2 -0.477234  0.414388  1.250544 -0.411658
3 -1.430851  0.258759  1.247752 -0.883293
4 -0.360181  0.485465  1.123589 -0.379157
Run Code Online (Sandbox Code Playgroud)

虽然apply不提供就地,但你可以做类似下面的事情(我认为无论如何都更明确):

num_df = df.select_dtypes(include=[np.number])
df[num_df.columns] = norm.cdf(num_df.values)
Run Code Online (Sandbox Code Playgroud)