Pandas 将函数应用于多列,使用来自另一个数据帧的值

时间:2021-04-21 08:53:30

标签: pandas dataframe apply

我有一个包含一些示例的数据框,以及另一个代表人口的数据框。对于示例 df 中的每个数字列,我想计算这些值相对于总体 df 的累积分布函数。

这依赖于总体 df 中的列均值和标准值 - 我无法在我的应用函数中找到正确引用这些均值和标准值的方法。

这是我正在尝试的简化示例:

示例:

df_test = pd.DataFrame([['Azriel', 45, 76], ['Moses', 23, 34]])
df_test.columns = (['Name', 'Age', 'Weight'])
     Name  Age  Weight
0  Azriel   45      76
1   Moses   23      34

人口:

df_comp = pd.DataFrame([['Mary', 28, 66], ['Joseph', 32, 86], ['Paul', 54, 88]])
df_comp.columns = (['Name', 'Age', 'Weight'])
     Name  Age  Weight
0    Mary   28      66
1  Joseph   32      86
2    Paul   54      88

我正在尝试在 df_dist 中进行计算:

df_dist = df_test.copy()
numeric_cols = df_comp.select_dtypes(include=[np.number]).columns
mu = df_comp[numeric_cols].mean()
sig = df_comp[numeric_cols].std()

df_dist[numeric_cols] = df_dist[numeric_cols].apply(lambda x: scipy.stats.norm.cdf(x, mu, sig))

df_dist 的输出为:

     Name       Age    Weight
0  Azriel  0.691462  0.996679
1   Moses  0.000001  0.000078

df_dist 的预期输出(手动计算):

                 Age              Weight
Azriel  0.6914624613    0.371154197
Moses   0.1419883859    0.00007804441375

你可以看到,Azriel's Age 和 Moses's Weight 的值是正确的,但其余的都是错误的。

当我只想引用 mu 和 sig 中的一个值时,我想我在尝试引用 apply 函数中的 mu 和 sig 时犯了一个错误。

我希望这是有道理的 - 任何人都可以看到解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果我们查看 musig,我们会看到它们是系列并且每个数字列都有值:

>>> mu

Age       38.0
Weight    80.0
dtype: float64

>>> sigma

Age       14.000000
Weight    12.165525
dtype: float64

当您为每列 apply 使用 CDF 函数时,您使用的是整体 musigma 系列,而不是使用特定于列(所以您的怀疑是正确的!)。

补救方法是在 apply 中使用列的名称,并相应地从 musigma 中进行选择:

df_dist[numeric_cols].apply(lambda x: scipy.stats.norm.cdf(x, mu[x.name], sig[x.name]))

x.name 将是例如"Age" 当应用 Age 列时,依此类推。

这给出:

     Name       Age    Weight
0  Azriel  0.691462  0.371154
1   Moses  0.141988  0.000078
相关问题