Рассчитать значения z с данными из нескольких файлов CSV в pandas - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть 2 DataFrames, такие как следующие.

DataFrame one (df1): это файл, в котором среднесуточное значение и стандартное отклонение доступны с ежедневным настроением.

date    mood      score    count     mean         std       abs
5/1/16  positive  1003.3015 2205    0.45501202  0.1948684  1003.3015
6/1/16  negative  -956.2049 2012    -0.4752509  0.19673153 956.2049
7/1/16  positive  952.049   2095    0.45443866  0.19968715 952.049
8/1/16  neutral    10.021   20       0.50105    0.19613942 10.021
9/1/16  positive  715.7656  1528    0.46843298  0.19674478 715.7656
10/1/16 positive  802.8556  1643    0.48865222  0.20401112 802.8556

DataFrame Two (df2): файл, в котором я хочу получить значение Z [df2 [оценка] -df1 [среднее]] / df1 [стандартное значение] в

date    score   mood
5/1/16  0.7089  positive
6/1/16  -0.6709 negative
7/1/16  0.564   positive
7/1/16  0.4078  positive
7/1/16  -0.2009 negative
8/1/16  0.0032  neutral

Поэтому я хочу получить значение Z для каждой строки в DataFrame Two. Чтобы сделать это, я должен получить среднее значение и стандартное отклонение от df1 , вычесть среднее значение из дневного показателя в df2 и разделить полученное значение на стандартное отклонение (стандартное отклонение) в df2 . , Но проблема в том, что df1 содержит только одно ежедневное настроение на дату с их средним значением и стандартным значением (в основном это сводный файл), где df2 содержит миллионы строк, а большинство дат имеют от сотен до тысяч баллов с разными настроениями.

Ожидаемый результат

date    score   mood         Zvalue 
5/1/16  0.7089  positive    1.30286892  
6/1/16  -0.6709 negative    -0.9944977  
7/1/16  0.564   positive    0.54866495  
7/1/16  0.4078  positive    -0.2335587  
7/1/16  -0.2009 negative     0         #because there is no negative mean or std value for this in df1
8/1/16  0.0032  neutral    -2.5382454   

Не удается кодировать его для получения ожидаемого результата. Я был бы очень признателен за помощь здесь. Если бы вы могли поместить некоторые комментарии по шагам, это было бы очень полезно. Большое спасибо.

1 Ответ

1 голос
/ 18 февраля 2020

Вот способ использования merge с параметром how = 'left' для слияния df1 и df2 данных.

# step 1 set new index and get only mean and std columns from df1
df1['date'] = pd.to_datetime(df1['date'])
df1 = df1.set_index(['date','mood'])[['mean', 'std']]

df1
Out[1]:

                             mean   std
        date    mood        
    2016-01-05  positive    0.455012    0.194868
    2016-01-06  negative    -0.475251   0.196732
    2016-01-07  positive    0.454439    0.199687
    2016-01-08  neutral     0.501050    0.196139
    2016-01-09  positive    0.468433    0.196745
    2016-01-10  positive    0.488652    0.204011

# step 2
df2['date'] = pd.to_datetime(df2['date'])
df2
Out[2]:

        date    score   mood
0   2016-01-05  0.7089  positive
1   2016-01-06  -0.6709 negative
2   2016-01-07  0.5640  positive
3   2016-01-07  0.4078  positive
4   2016-01-07  -0.2009 negative
5   2016-01-08  0.0032  neutral



# step 3: merge

df3 = df2.merge(df1, left_on = ['date','mood'], right_index = True, how = 'left')[['date','score','mood','std','mean']]

df3
Out[3]:

              date  score   mood         std        mean
   0    2016-01-05  0.7089  positive    0.194868    0.455012
   1    2016-01-06  -0.6709 negative    0.196732    -0.475251
   2    2016-01-07  0.5640  positive    0.199687    0.454439
   3    2016-01-07  0.4078  positive    0.199687    0.454439
   4    2016-01-07  -0.2009 negative    NaN         NaN
   5    2016-01-08  0.0032  neutral     0.196139    0.501050




df3['Zvalue'] = (df3['score']-df3['mean'])/df3['std']

df3[['date','score','mood','Zvalue']].fillna(0)
Out[4]:


         date   score   mood        Zvalue
0   2016-01-05  0.7089  positive    1.302869
1   2016-01-06  -0.6709 negative    -0.994498
2   2016-01-07  0.5640  positive    0.548665
3   2016-01-07  0.4078  positive    -0.233559
4   2016-01-07  -0.2009 negative    0.000000
5   2016-01-08  0.0032  neutral     -2.538245
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...