【问题标题】:Obtain data in the desired format获取所需格式的数据
【发布时间】:2018-10-22 15:45:39
【问题描述】:

我对 Python 有点陌生,我有以下要求。

Value         Date  Ticket  Source  Result
0.939531371 3/1/2018    T1  Source1  1
0.951619897 3/1/2018    T2  Source1  1
0.952681914 3/1/2018    T3  Source1  0
0.957009407 3/1/2018    T4  Source2  1
0.962669466 3/1/2018    T5  Source2  0 
0.963068552 3/1/2018    T6  Source3  1
0.963480195 3/1/2018    T7  Source4  1
0.951296258 3/2/2018    T11 Source5  1
0.962434762 3/2/2018    T12 Source5  1
0.950224149 3/2/2018    T13 Source5  1
0.961191873 3/2/2018    T14 Source5  1
0.952584896 3/2/2018    T15 Source5  0
0.962093595 3/2/2018    T16 Source5  1
0.975999737 3/2/2018    T17 Source5  1

我想从这个数据帧生成下面的数据帧-

Date      Source1 Source2 Source3 Source4 Source5 Overall_Result
3/1/2018   0.93     0.95   0.96     0.96      0        0.7
3/2/2018     0        0      0        0      0.95      0.85

这里涉及的计算是加权平均-

来源1 - 对于给定的日期和给定的来源,我们需要获取票的总数。对于 Source1,在给定日期(2018 年 3 月 1 日)有 3 条记录(票证)。这些票的“价值”列必须按升序排序。然后根据票的数量,最高的权重必须给最小的“价值”

0.945=(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)/3+2+1

根据给定日期计算总体结果列,

1 的数量除以该日期的门票总数 日期 - 2018 年 3 月 1 日 => 1+1+0+1+0+1+1+0+1+1/10=0.66

我有大量数据需要进行这些计算。 Source 列值的数量也可能很大。在修改后的数据框中,我希望它作为一列。 一种方法是在函数中编写逻辑并调用每条记录。 欢迎任何建议或帮助。提前致谢。

【问题讨论】:

  • 你能检查一下你的例子中的数学吗?我得到0.9457 = ((0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488))/(3+2+1)
  • 感谢@ALollz 的更正...更正了问题!!..

标签: python python-3.x pandas dataframe weighted-average


【解决方案1】:

您可以使用pivot_table 和自定义聚合函数来获取第一列。并groupby 添加“结果”列。

import numpy as np
import pandas as pd

df2 = df.sort_values('Value').pivot_table(
        index='Date', 
        columns='Source',
        values='Value',
        aggfunc = lambda x: (x*np.arange(len(x), 0, -1)).sum()/np.arange(len(x), 0, -1).cumsum()[-1]).fillna(0)

df2['Result'] = df.groupby('Date').Result.apply(lambda x: x.sum()/np.size(x))

输出:

Source     Source1   Source2   Source3  Source4   Source5    Result
Date                                                               
3/1/2018  0.945753  0.958896  0.963069  0.96348  0.000000  0.714286
3/2/2018  0.000000  0.000000  0.000000  0.00000  0.955507  0.857143

【讨论】:

    【解决方案2】:

    您可能忘记在加权平均计算中使用括号:

    > 0.93=[(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)]/(3+2+1)
    

    另外,尝试在"Value" 上使用带有自定义聚合函数的数据透视表:

    def func(series) : 
      s = series.sort_values().reset_index(drop=True).reset_index()
      return s.apply(lambda x : (len(s) - x["index"]) * x["Value"] /sum(np.arange(1, len(s) + 1)), axis=1).sum()
    

    上面的函数计算熊猫系列的加权平均值:

    • 首先对值进行排序,然后按照排序顺序重置索引。
    • 然后计算加权平均值。

    然后调用这个聚合函数如下:

    df1 = df.pivot_table(index="Date", columns="Source", aggfunc={"values" : func})
    

    返回:

    +----------+----------+----------+----------+---------+----------+
    |          |  Value   |          |          |         |          |
    +----------+----------+----------+----------+---------+----------+
    | Source   | Source1  | Source2  | Source3  | Source4 | Source5  |
    | Date     |          |          |          |         |          |
    +----------+----------+----------+----------+---------+----------+
    | 3/1/2018 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
    | 3/2/2018 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
    +----------+----------+----------+----------+---------+----------+
    

    那么对于Overall_Result:

    df2 = df.pivot_table(index="Date",  values="Result", aggfunc="mean")
    

    返回

    +----------+----------+
    |          |  Result  |
    +----------+----------+
    | Date     |          |
    | 3/1/2018 | 0.714286 |
    | 3/2/2018 | 0.857143 |
    +----------+----------+
    

    最后你可以连接你的两个数据帧来获得所需的数据帧:

    df1.columns = df1.columns.droplevel()
    df2.columns = ["Overall_Result" ]
    dfResult = pd.concat([df1, df2], axis=1)
    

    +----------+----------------+----------+----------+----------+---------+----------+
    |          | Overall_Result | Source1  | Source2  | Source3  | Source4 | Source5  |
    +----------+----------------+----------+----------+----------+---------+----------+
    | Date     |                |          |          |          |         |          |
    | 3/1/2018 |       0.714286 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
    | 3/2/2018 |       0.857143 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
    +----------+----------------+----------+----------+----------+---------+----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多