我有一个包含一些示例的数据框,以及另一个代表人口的数据框。对于示例 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 时犯了一个错误。
我希望这是有道理的 - 任何人都可以看到解决方案吗?
答案 0 :(得分:0)
如果我们查看 mu
和 sig
,我们会看到它们是系列并且每个数字列都有值:
>>> mu
Age 38.0
Weight 80.0
dtype: float64
>>> sigma
Age 14.000000
Weight 12.165525
dtype: float64
当您为每列 apply
使用 CDF 函数时,您使用的是整体 mu
和 sigma
系列,而不是使用特定于列(所以您的怀疑是正确的!)。
补救方法是在 apply
中使用列的名称,并相应地从 mu
和 sigma
中进行选择:
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