【问题标题】:Calculate z values with data from multiple csv files in pandas使用 pandas 中多个 csv 文件中的数据计算 z 值
【发布时间】:2020-02-18 10:47:31
【问题描述】:

我有 2 个 DataFrame,如下所示。

数据帧一(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 2 (df2):我想要获取 Z 值的文件 [df2[score]-df1[mean]]/df1[std] in

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 2 中每一行的 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   

无法对其进行编码以获得预期的输出。我真的很感激这里的一些帮助。如果您可以逐步放置一些 cmets,那将非常有帮助。非常感谢。

【问题讨论】:

  • 我可以得到预期的Zvalue,除了 0。我无法理解评论。您能否详细说明一下,以便我可以发布符合您所有要求的答案?还是您更喜欢立即回答,即使是部分回答?
  • @SergeBallesta 评论说因为 df1 中没有与“消极”情绪相关的“平均和标准”,它无法计算该日期的 z 值。让我知道它是否澄清。

标签: python pandas dataframe


【解决方案1】:

这里是使用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

【讨论】:

  • 嗨,我收到以下错误。 KeyError:“['score_x'] 不在索引中。
  • 嗨!你确定,在你合并之前,两个数据框(df1和df2)都有'score'列,就像你在顶部的例子一样?
  • 好吧,没关系,我已经更新了代码。再检查一遍
  • 哦..该死的.. df1 上的 score 列有一个名为 ['mean']。我能够运行代码。但结果显示 zValue 列中的所有“Nan”值。这是一个问题,因为我没有在问题的 df1 中包含一列吗?想减少分心。
  • hm) 对我来说还是有点不清楚。 df1 在您的源数据中有哪些列?你能在这里显示 df1.columns 吗?
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 2020-06-24
  • 2019-08-01
  • 1970-01-01
  • 2019-01-31
  • 2017-09-05
相关资源
最近更新 更多