Примените Гауссово Распределение ко всем значениям определенного столбца, когда среднее и стандартное значения зависят от значений другого столбца - PullRequest
0 голосов
/ 05 сентября 2018

Есть ли способ создать новый столбец, который содержит гауссово / нормальное распределение значений каждого столбца для каждого другого значения столбца?

Что я имею в виду, если у меня есть 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 представляет собой повтор строки из уникальных значений столбца CS из Исходный фрейм данных 1 .

Для достижения моей цели мне нужно извлечь среднее значение и стандартное значение из исходного кадра данных 1 для всех уникальных значений Cs , чтобы я мог затем применить его к Original Фрейм данных 2 в столбце age Age , чтобы получить новый df - Желаемый кадр данных с новым столбцом Вероятность .

Поскольку среднее значение и стандартное значение для Исходного кадра данных 1 в этом случае составляют:

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

1 Ответ

0 голосов
/ 06 сентября 2018

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).

...