[英]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'
用於合並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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.