簡體   English   中英

使用來自 Pandas 中多個 csv 文件的數據計算 z 值

[英]Calculate z values with data from multiple csv files in pandas

我有 2 個數據幀,如下所示。

數據幀一 (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

數據幀二 (df2):我想在其中獲取 Z 值的文件 [df2[score]-df1[mean]]/df1[std]

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

所以我想基本上得到的是 DataFrame Two 中每一行的 Z 值。 為此,我必須從 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   

無法對其進行編碼以獲得預期的輸出。 我真的很感激這里的一些幫助。 如果您可以分步添加一些評論,那將非常有幫助。 非常感謝。

這是merge使用參數how = 'left'用於合並df1df2數據幀的方法。

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM