有没有办法创建一个新列,其中包含每个列值的高斯/正态分布?
我的意思是,如果我有2个具有以下结构的数据帧:
>> Original Dataframe 1
Samp Age Cs
1 A 51 msi
2 B 62 cin
3 C 55 msi
4 D 70 ebv
5 E 56 gs
....
>> Original DataFrame 2
Samp Cs Age
0 A cin 51
1 A ebv 51
2 A gs 51
3 A msi 51
4 B cin 62
5 B ebv 62
6 B gs 62
7 B msi 62
8 C cin 55
9 C ebv 55
10 C gs 55
11 C msi 55
12 D cin 70
13 D ebv 70
14 D gs 70
15 D msi 70
16 E cin 56
17 E ebv 56
18 E gs 56
19 E msi 56
...
如您所见,原始数据帧2是原始数据帧1中CS列的唯一值的n行重复。
为了实现我的目标,我需要从原始数据帧1中检索均值和标准值到所有唯一的Cs值,因此我可以进一步将其应用于年龄年龄列中的原始数据帧2,以获得新的df - 所需的数据帧新专栏概率。
由于在这种情况下原始DataFrame 1的mean和std是:
m = {'msi': 70.7, 'ebv': 63.2, 'cin': 66.9, 'gs': 59.3}
std = {'msi': 8.7, 'ebv': 11.2, 'cin': 10.2, 'gs': 10.2}
有没有办法输出以下数据帧?
>> Desired DataFrame
Samp Cs Age Probability
0 A cin 51 0.01160
1 A ebv 51 0.01968
2 A gs 51 0.02809
3 A msi 51 0.00353
4 B cin 62 0.03485
5 B ebv 62 0.03542
6 B gs 62 0.03777
7 B msi 62 0.00455
8 C cin 55 0.01980
9 C ebv 55 0.02725
10 C gs 55 0.03579
11 C msi 55 0.00900
12 D cin 70 0.03735
13 D ebv 70 0.02963
14 D gs 70 0.02256
15 D msi 70 0.04570
16 E cin 56 0.02210
17 E ebv 56 0.02897
18 E gs 56 0.03712
19 E msi 56 0.01100
...
到目前为止,我试图这样做:
def get_age_cs_probs(df):
df['Probability'] = df.groupby('Cs').Age.apply(lambda x:
(1/(np.sqrt(2*3.14*(x.std()**2))))*(np.exp(-(((x-x.mean())**2)/(2*(x.std()**2))))))
return df
scipy.stats.zmap
将根据不同的数组为您的阵列提供z分数。
这个结果可以输入scipy.stats.norm.cdf()
,它会将你的z分数转换成概率。
查看这两个函数,以查看是否要指定不同于默认值的df或其他值。
我有一个答案,每个'Cs'值生成一个概率列表列表,但不能完全找到一个干净的方法让它回到df2。
df1
Out[117]:
Samp Age Cs
1 A 51 msi
2 B 62 cin
3 C 55 msi
4 D 70 ebv
5 E 56 gs
df2
Out[118]:
Samp Cs Age Probability
0 A cin 51 0.01160
1 A ebv 51 0.01968
2 A gs 51 0.02809
3 A msi 51 0.00353
4 B cin 62 0.03485
5 B ebv 62 0.03542
6 B gs 62 0.03777
7 B msi 62 0.00455
8 C cin 55 0.01980
9 C ebv 55 0.02725
10 C gs 55 0.03579
11 C msi 55 0.00900
12 D cin 70 0.03735
13 D ebv 70 0.02963
14 D gs 70 0.02256
15 D msi 70 0.04570
16 E cin 56 0.02210
17 E ebv 56 0.02897
18 E gs 56 0.03712
19 E msi 56 0.01100
[st.norm.cdf(st.zmap(df2[df2.loc[:, 'Cs'] == x].Age, df1[df1.loc[:, 'Cs']==x].Age)) for x in df2.Cs.unique()]
Out[119]:
[array([ 0., nan, 0., 1., 0.]),
array([ 0., 0., 0., nan, 0.]),
array([ 0., 1., 0., 1., nan]),
array([0.15865525, 0.9999966 , 0.84134475, 1. , 0.9331928 ])]
这与您的预期输出不完全匹配,但如果您的df1具有您在问题中列出的属性(即,相同的m和sd值),则会出现这种情况。